【BZOJ】【2440】【中山市选2011】完全平方数
莫比乌斯函数/容斥原理
PoPoQQQ讲义引入例题= =
比较水……就是莫比乌斯函数的简单应用,也可理解为乱容斥一下……
二分答案——>求1~x有多少个无平方因子的数Q(x)。
引用一下PoPoQQQ的题解:
•根据容斥原理可知 对于sqrt(x)以内所有的质数 有
• x以内的无平方因子数
•=0个质数乘积的平方的倍数的数的数量(1的倍数)
•-每个质数的平方的倍数的数的数量(9的倍数,25的倍数,...)
•+每2个质数乘积的平方的倍数的数的数量(36的倍数,100的倍数,...)-...
•容易发现每个乘积a前面的符号恰好是
(例如
故9对答案的贡献为负;
,故36对答案的贡献为正)
•x以内i^2的倍数有
个 故有![](data:image/png;base64,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)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }