4 条题解

  • 1
    @ 2026-5-28 8:40:24

    优化思路详见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
    上传者