【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 }

2017-04-20 20:20:29

时间: 2024-10-27 04:48:46

【BZOJ 2986】 莫比乌斯函数+容斥原理的相关文章

BZOJ 2440: [中山市选2011]完全平方数(二分答案 + 莫比乌斯函数 + 容斥原理)

传送门 2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2693  Solved: 1307[Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送

[BZOJ 2440][中山市选2011]完全平方数(容斥原理/莫比乌斯函数+二分)

Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一 个小X讨厌的数.他列出了所有小X不讨厌的数,然后选取了第 K个数送给了 小X.小X很开心地收下了. 然而现在小 W 却记不起送给小X的是哪个数了.你能帮他一下吗? Solution 二分答案,于是问题转化成了如何求出不含完全平方数因

容斥原理算法总结(bzoj 2986 2839)

容斥原理是一个从小学就开始学习的算法.但是很多难题现在都觉得做的十分吃力. 容斥原理大概有两种表现形式,一种是按照倍数进行容斥,这个东西直接用莫比乌斯函数就可以了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 200100 typedef long long qword; bool pfl

[BZOJ 2440] [中山市选2011] 完全平方数 【二分 + 莫比乌斯函数】

题目链接:BZOJ - 2440 题目分析 首先,通过打表之类的方法可以知道,答案不会超过 2 * k . 那么我们使用二分,对于一个二分的值 x ,求出 [1, x] 之间的可以送出的数有多少个. 怎么来求呢?我们使用容斥原理. 先求出不能送的数(即含有平方因子的数)有多少个,然后用总数减去就可以了. 那么,就是 含有一个质数平方因子的数(2^2的倍数 + 3^2的倍数 + 5^2的倍数....) - 含有两个质数平方因子的数((2 * 3)^2的倍数 + (2 * 5)^2的倍数 + ...

BZOJ 2440 中山市选 2011 完全平方数 莫比乌斯函数+二分

题目大意 给出一个数k,求第k个不是完全平方数个数的数字(这里的完全平方数并不包括1). 思路 首先介绍一下莫比乌斯函数(M?bius): μ(x)=? ? ? ? ? ? ?  1(?1) k 0 x=1能分解成k个不同的质因数的乘积其他情况 然后呢,由于莫比乌斯函数是个积性函数,于是我们就可以线性地求出所有需要的莫比乌斯函数值. 剩下的工作就是在外层套一个二分,转成判定问题,小于一个数的数字中有多少个数字不是完全平方数的倍数.这个东西用容斥乱搞一下就好了~ CODE #define _CRT

莫比乌斯函数&amp;莫比乌斯反演

莫比乌斯函数:http://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html  OrzPoPoQQQ 这个证明过程第三步和第四步一开始没看懂…… 第三步:观察计算左边f(k)的系数,可以看出只要d不大于n/k均可以使μ(d)成为f(k)的系数,那么f(k)的系数就是sigma[d丨(n/k)] μ(d) (方括号内为d的范围) 利用整除的性质,重新组合了一下这几项,相当于对一个多项式重新分组提取因式什么的…… 第四步:利用sigma μ(d)=

【数论】莫比乌斯函数

莫比乌斯函数     莫比乌斯函数!?提到这个东西你会不会想到一个大神级的玩意:莫比乌斯反演       莫比乌斯函数其实很简单,非常非常简单…… 好了,步入正题吧……        我们定义一个函数M,参数为x,函数内容如下: X=X1^P1*X2^P2*……*Xa^Xk        那么这个式子到底是用来干什么的呢?        我们使X1.X2.X3都存在一个素数集合中,那么它们必定都是素数        则P1.P2.P3……为指数,因为对于任何数x(x>=2),都可以写成这种形式.

[bzoj2440]完全平方数[中山市选2011][莫比乌斯函数][线性筛][二分答案]

题意:求第k个分解质因子后质因子次数均为一的数,即求第k个无平方因子数. 题解: 首先二分答案mid,那么现在就是要求出mid以内的无平方因子数的个数. 其次枚举$\sqrt{mid}$内的所有质数,由容斥原理 $Num=0个质数平方的倍数的数量(1的倍数)-1个质数平方的倍数的数量(9,25...的倍数)$ $+2个质数平方的倍数的数量(36,100...的倍数)...$ 可以发现对于一个数x,x的倍数数量对答案的贡献符号为$\mu(x)$. 例如:9的倍数数量最答案的贡献是$\mu(9)\l

与莫比乌斯反演没什么关系的莫比乌斯函数题

Codeforces 1139D. Steps to One 题目大意: 给出$m$,一个空的数列,每次可以$rand$一个数$x\in[1,m]$放到数列的末尾,若整个数列的$gcd==1$则停止加入数 求数列的期望长度 思路: 考虑当前整个数列的$gcd$为质数$p$的倍数,则若下一个数还是$p$的倍数即$\sum\limits_{i=1}^m [gcd(i,p)==p]$,相当于没变 则设当前$gcd$对答案产生的贡献为$ans_x$得到:$ans_x=1+ \sum\limits_{i=