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个,发现每个数的贡献是莫比乌斯函数。

posted on 2016-03-21 23:23  xiyuedong  阅读(95)  评论(0编辑  收藏  举报