【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

转载于:https://www.cnblogs.com/Konjakmoyu/p/6740616.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值