首页 > 代码库 > 【BZOJ 2986】 莫比乌斯函数+容斥原理

【BZOJ 2986】 莫比乌斯函数+容斥原理

2986: Non-Squarefree Numbers

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 337  Solved: 156

Description

一个正整数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 }
View Code

 

2017-04-20 20:20:29

【BZOJ 2986】 莫比乌斯函数+容斥原理