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

【BZOJ】【2440】【中山市选2011】完全平方数

时间:2015-02-22 19:36:17      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

莫比乌斯函数/容斥原理

  PoPoQQQ讲义引入例题= =

  比较水……就是莫比乌斯函数的简单应用,也可理解为乱容斥一下……

  二分答案——>求1~x有多少个无平方因子的数Q(x)。

 

引用一下PoPoQQQ的题解:

•根据容斥原理可知 对于sqrt(x)以内所有的质数 有
•  x以内的无平方因子数
•=0个质数乘积的平方的倍数的数的数量(1的倍数)
•-每个质数的平方的倍数的数的数量(9的倍数,25的倍数,...)
•+每2个质数乘积的平方的倍数的数的数量(36的倍数,100的倍数,...)-...
•容易发现每个乘积a前面的符号恰好是技术分享(例如技术分享故9对答案的贡献为负;技术分享,故36对答案的贡献为正)
•x以内i^2的倍数有技术分享个 故有技术分享
技术分享
 1 /**************************************************************
 2     Problem: 2440
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:2360 ms
 7     Memory:10060 kb
 8 ****************************************************************/
 9  
10 //BZOJ 2440
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 using namespace std;
20  
21 int getint(){
22     int v=0,sign=1; char ch=getchar();
23     while(ch<0||ch>9) {if (ch==-) sign=-1; ch=getchar();}
24     while(ch>=0&&ch<=9) {v=v*10+ch-0; ch=getchar();}
25     return v*=sign;
26 }
27 /*******************tamplate********************/
28 const int N=1e6+10;
29 typedef long long LL;
30 int mu[N],prime[N];
31 bool check[N];
32 void getmu(int n){
33     int tot=0;
34     mu[1]=1;
35     for(int i=2;i<n;++i){
36         if (!check[i]){
37             prime[tot++]=i;
38             mu[i]=-1;
39         }
40         rep(j,tot){
41             if (i*prime[j]>n) break;
42             check[i*prime[j]]=1;
43             if (i%prime[j]) mu[i*prime[j]]=-mu[i];
44             else{
45                 mu[i*prime[j]]=0;
46                 break;
47             }
48         }
49     }
50 }
51 int judge(int x){
52     int ans=0;
53     for(int i=1;i*i<=x;i++)
54         ans+=mu[i]*((LL)x/(i*i));
55     return ans;
56 }
57 int main(){
58     int T=getint(),n;
59     getmu(N-2);
60     while(T--){
61         n=getint();
62         int l=1,r=n*2,mid=0,now=0;
63         while(l<r){
64             mid=l+(r-l>>1);
65             now=judge(mid);
66             if (now<n) l=mid+1;
67             else r=mid;
68         }
69         printf("%d\n",l);
70     }
71     return 0;
72 }
View Code

 

【BZOJ】【2440】【中山市选2011】完全平方数

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4297641.html

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