标签:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #define N 44725 6 #define ll long long 7 using namespace std; 8 int tot,zhan[N+2],mo[N+2],mark[N+2],T,n,ans; 9 bool pan(ll M) 10 { 11 int a1=sqrt(M),sum=0; 12 for(int i=1;i<=a1;i++) 13 sum+=mo[i]*(M/(i*i)); 14 if(sum>=n) 15 return 1; 16 return 0; 17 } 18 int main() 19 { 20 scanf("%d",&T); 21 mo[1]=1; 22 for(int i=2;i<=N;i++) 23 { 24 if(!mark[i]) 25 { 26 zhan[++tot]=i; 27 mo[i]=-1; 28 } 29 for(int j=1;j<=tot&&i*zhan[j]<=N;j++) 30 { 31 mark[i*zhan[j]]=1; 32 if(i%zhan[j]) 33 mo[i*zhan[j]]=-mo[i]; 34 else 35 { 36 mo[i*zhan[j]]=0; 37 break; 38 } 39 } 40 } 41 for(int i=1;i<=T;i++) 42 { 43 scanf("%d",&n); 44 ll l=1,r=2*n; 45 for(;l<=r;) 46 { 47 ll mid=(l+r)>>1; 48 if(pan(mid)) 49 { 50 ans=mid; 51 r=mid-1; 52 } 53 else 54 l=mid+1; 55 } 56 printf("%d\n",ans); 57 } 58 return 0; 59 }
根据容斥原理,0个质数(1)的倍数的平方的个数-1个+2个-3个,发现每个数的贡献是莫比乌斯函数。
标签:
原文地址:http://www.cnblogs.com/xydddd/p/5304318.html