思路就是按 ai−1bi 排序,如果 ans>106 显然直接乘更优。感觉没问题,为啥会 90pts?
bool _Start;
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define Tp template<typename T>
#define Ts template<typename T,typename... _T>
Tp il void read(T& x) {
x=0;bool f=0;char c=getchar();
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);
x=(f?-x:x);
}Ts il void read(T& x,_T&... y) {read(x),read(y...);}
using ll=__int128;
const int N=5e5+5,mod=1e9+7;
int n;
ll ans;
struct node {
ll a,b;
long double div;
}p[N];
bool _End;
int main() {
fprintf(stderr,"Memory: %.4lf Mib\n",abs(&_End-&_Start)/1048576.0);
read(n);
for(int i=1;i<=n;i++) read(p[i].a);
for(int i=1;i<=n;i++) read(p[i].b);
ans=1;
for(int i=1;i<=n;i++)
if(p[i].a==1) ans+=p[i].b;
for(int i=1;i<=n;i++)
if(p[i].a!=1) p[i].div=p[i].b*1.0/(p[i].a-1);
sort(p+1,p+1+n,[](node x,node y) {
return x.div>y.div;
});
bool bk=0;
for(int i=1;i<=n;i++) {
if(p[i].a==1) continue;
if(bk) ans=ans*p[i].a%mod;
else {
if(p[i].div>ans) ans=(ans+p[i].b);
else ans=ans*p[i].a;
if(ans>=1e6) ans%=mod,bk=1;
}
}
printf("%lld\n",(long long)ans);
return 0;
}