BZOJ 2440 完全平方数(莫比乌斯反演,容斥原理)

http://www.lydsy.com/JudgeOnline/problem.php?id=2440

题意:求第K个没有平方因子的数

思路:首先,可以二分数字,然后问题就转变成x以内有多少无平方因子的数

根据容斥原理:x以内无平方因子数=1*无需是任何质数的倍数的数数量-1*至少是1个质数的平方的倍数的数数量+1*至少是2个质数的平方的倍数的数量-1*至少是3个质数的平方的倍数的数量............然后发现,莫比乌斯函数u[i]正好满足:当i是不同的质数乘积时,返回-1,有相同因子就返回1,否则返回0

因此枚举i从1到根号x,ans+=mul[i]*x/(i*i)

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #define N 160000
 7 #define ll long long
 8 int mark[200005],p[200005],mul[200005];
 9 int read(){
10     char ch=getchar();int t=0,f=1;
11     while (ch<‘0‘||ch>‘9‘){if (ch==‘0‘) f=-1;ch=getchar();}
12     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
13     return t*f;
14 }
15 void init(){
16     mul[1]=1;
17     for (int i=2;i<=N;i++){
18         if (!mark[i]){
19             p[++p[0]]=i;
20             mul[i]=-1;
21         }
22         for (int j=1;j<=p[0]&&p[j]*i<=N;j++){
23             mark[i*p[j]]=1;
24             if (i%p[j]) mul[i*p[j]]=-mul[i];
25             else{
26                 mul[i*p[j]]=0;
27                 break;
28             }
29         }
30     }
31 }
32 ll cal(ll x){
33     ll sum=0;
34     for (ll i=1;i*i<=x;i++)
35       sum+=x/(i*i)*mul[(int)i];
36     return sum;
37 }
38 int main(){
39     init();
40     int T=read();
41     while (T--){
42         ll K=(ll)read();
43         ll L=K,R=1644934081LL,ans=0;
44         while (L<=R){
45             ll mid=(L+R)>>1;
46             if (cal(mid)>=K) ans=mid,R=mid-1;
47             else L=mid+1;
48         }
49         printf("%lld\n",ans);
50     }
51 }
时间: 2024-10-30 23:54:43

BZOJ 2440 完全平方数(莫比乌斯反演,容斥原理)的相关文章

bzoj 2440 简单莫比乌斯反演

题目大意: 找第k个非平方数,平方数定义为一个数存在一个因子可以用某个数的平方来表示 这里首先需要考虑到二分才可以接下来做 二分去查找[1 , x]区间内非平方数的个数,后面就是简单的莫比乌斯反演了 容斥原理的思想,首先考虑所有数都属于非平方数 那么就是x 然后对于每一个平方数都要减去,但是这里应该只考虑质数的平方数就可以了 那么就扩展为x - x/(2^2) - x/(3^2) - x/(k^2).... 然后因为中间存在重复减的那么要加回来 -> x - x/(2^2) - x/(3^3) 

HYSBZ 2440 完全平方数(莫比乌斯反演)

若i为质数,n为i*i的倍数,则称n为含平方因子数. 求1~n的无平方因子数. F(x)为1~x的平方因子数数量,则由容斥原理及莫比乌斯函数知: G(x)为1~x的无平方因子数数量,则: 二分法枚举,注意二分法的写法. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<vector> #inc

bzoj [SDOI2014]数表 莫比乌斯反演 BIT

bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[gcd(i,j)]<=a] \] \[ f[]可以O(n)预处理出来 \] \[ \sum\limits_{k=1}^{n}f[k]*\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}[gcd(i,j)==k] \] \[ \sum\limits_{k=1}^{n}

BZOJ 2440 完全平方数(莫比乌斯反演+二分查找)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23362 题意:定义含有平方数因子的数为完全平方数(平方数因子不包含1).求第k个非完全平方数. 思路:我们先求出[1, n]的非完全平方数的个数,然后利用二分来查找正好等于k时的n(注意这样的n可能不止一个,求最左边的).关键是,怎么求出前者,我们可以利用容斥原理,用n - [1, n]内完全平方数的个数,求[1, n]内完全平方数的个数,用容斥发现前面的系数就是

BZOJ 2301: [HAOI2011]Problem b(莫比乌斯反演 + 容斥原理 + 分块优化)

传送门 Problem 2301. – [HAOI2011]Problem b 2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 3671  Solved: 1643[Submit][Status][Discuss] Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input

[HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]

题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? 很简单,容斥原理搞之 我们设f(x,y)代表gcd(i,j)==e(1<=i<=x,1<=j<=y)的无序数对(i,j)的个数 那么本题答案相当于f(d,b)-f(c-1,b)-f(a-1,d)+f(a-1,c-1) 再来看反演超时的问题 我们注意到原反演过程中,f(1)==mu(i)

BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2534  Solved: 1129 [Submit][Status][Discuss] Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint 对于样例(2,2),(2,4),(3,3),(4,2)

bzoj 1101 Zap —— 莫比乌斯反演

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 直接莫比乌斯反演. 代码如下: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int const xn=5e5+5; int pri[xn],cnt,mu[xn]; bool vis[xn]; int rd()

BZOJ 2440 完全平方数 (容斥+莫比乌斯反演+二分)

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