先用二分把问题转化一下,然后利用容斥定理和莫比乌斯函数搞一搞就好了。
/************************************************************** Problem: 2440 User: mybing Language: C++ Result: Accepted Time:4908 ms Memory:2556 kb ****************************************************************/ #include<bits/stdc++.h> using namespace std; int f[100010],tot=0,prime[100010],mu[100010],T,n; bool not_prime[100010]; bool pd(long long p,long long w) { long long sum=0; for(long long i=1;i*i<=p;i++) { sum+=p/(i*i)*mu[i]; } if(sum>=w)return true; else return false; } void work(int p) { long long l=1,r=3000000000; while(l+1<r) { long long mid=(l+r)>>1; if(pd(mid,(long long)p))r=mid; else l=mid; } if(pd(l,n))printf("%lld ",l); else printf("%lld ",r); } int main() { memset(not_prime,true,sizeof(not_prime)); mu[1]=1; for(int i=2;i<=100000;i++) { if(not_prime[i]) { prime[++tot]=i; mu[i]=-1; } for(int j=1;j<=tot&&i*prime[j]<=100000;j++) { not_prime[i*prime[j]]=false; if(i%prime[j]==0) { not_prime[prime[j]*i]=false; mu[prime[j]*i]=0; break; } mu[i*prime[j]]=-1*mu[i]; } } scanf("%d",&T); while(T--) { scanf("%d",&n); work(n); } return 0; }