码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 2440: [中山市选2011]完全平方数

时间:2016-03-22 00:20:48      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

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

bzoj 2440: [中山市选2011]完全平方数

标签:

原文地址:http://www.cnblogs.com/xydddd/p/5304318.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!