4 条题解
-
1
优化思路详见zhengtDL(具体实现稍微有点区别)
温馨提示:先枚举质数p,再二分答案,可能 会更快一点哦
#include<bits/stdc++.h> using namespace std; char buf[1<<20],*p1,*p2; #define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++) inline long long rd(){ long long x=0;int f=1;char c=gc(); for(;c<'0'||'9'<c;c=gc()) if(c=='-') f=-1; for(;'0'<=c&&c<='9';c=gc()) x=(x<<3)+(x<<1)+(c^48); return x*f; } inline void wt(long long x){ if(x<0) putchar('-'),x=-x; if(x>9) wt(x/10); putchar('0'+x%10); } int n=600,m,prime[2005]; bitset<2005> not_prime; void euler(){ for(int i=2;i<=n;i++){ if(!not_prime[i]){ prime[++m]=i; } for(int j=1;j<=m&&i*prime[j]<=n;j++){ not_prime[prime[j]*i]=1; if(!(i%prime[j])) break; } } } bool check(long long x,int p,long long ct){ long long cnt=0; for(int i=1;i<=ct&&x;i++){ x/=p;cnt+=x; if(cnt>=ct) return 1; }return 0; } int T,K; long long c[105]; long long ans; const long long INF=0x7f7f7f7f7f7f7f7f; //const __int128 INF=INF1*INF1; int main() { // wt(INF);putchar('\n'); euler(); // cout<<m<<'\n'; T=rd(); while(T--){ ans=1; K=rd(); for(int i=1;i<=K;i++) c[i]=rd(); for(int i=1;i<=K;i++){ long long l=ans,r=INF,mid,ans1=0; if(check(l,prime[i],c[i])) continue; while(l<=r){ mid=((r-l)>>1)+l; if(check(mid,prime[i],c[i])) r=mid-1,ans1=mid; else l=mid+1; } ans=max(ans,ans1); } wt(ans);putchar('\n'); } return 0; }
信息
- ID
- 737
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 53
- 已通过
- 4
- 上传者