【BZOJ 2986】 莫比乌斯函数+容斥原理
2986: Non-Squarefree Numbers
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 337 Solved: 156Description
一个正整数K被称为squarefree,如果它没有一个D^2(D>1)这样的约数。
Input
读入一个正整数N
Output
找出第N个不是squarefree的数。1<=N<=10^10
Sample Input
10
Sample Output
27
Hint
前10个非squarefree的数
4 8 9 12 16 18 20 24 25 27
HINT
Source
【分析】
跟这题一模一样->传送门
【第一次二分打错。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define Maxm 1000010 8 #define LL long long 9 10 LL pri[Maxm],pl,mu[Maxm]; 11 bool vis[Maxm]; 12 void init() 13 { 14 for(LL i=2;i<=Maxm-10;i++) 15 { 16 if(!vis[i]) pri[++pl]=i,mu[i]=-1; 17 for(LL j=1;j<=pl;j++) 18 { 19 if(pri[j]*i>Maxm-10) break; 20 vis[pri[j]*i]=1; 21 if(i%pri[j]==0) mu[pri[j]*i]=0; 22 else mu[i*pri[j]]=-mu[i]; 23 if(i%pri[j]==0) break; 24 } 25 } 26 } 27 28 LL n; 29 bool check(LL x) 30 { 31 LL ans=0; 32 for(LL i=2;i*i<=x;i++) 33 { 34 ans+=x/(i*i)*(-mu[i]); 35 } 36 return ans>=n; 37 } 38 39 int main() 40 { 41 init(); 42 scanf("%lld",&n); 43 LL l=0,r=30000000000LL; 44 while(l<r) 45 { 46 LL mid=(l+r)>>1; 47 if(check(mid)) r=mid; 48 else l=mid+1; 49 } 50 printf("%lld\n",l); 51 return 0; 52 }
2017-04-20 20:20:29