[莫比乌斯反演+分块求和] BZOJ2820: YY的GCD
来源:互联网 发布:淘宝一个差评多少钱 编辑:程序博客网 时间:2024/06/05 22:43
题意
给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对。
T(组数) = 10000 N,M<=10000000
题解
如果我们枚举质数
设
反演得:
总答案为:
现在就是要考虑如何优化求和过程了。
注意到
如果我们能求出后面这个
其实直接暴力枚举p就能求啦,复杂度是O(n)的。因为素数个数约为
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10000005, N=10000000;int n,m,_test,mu[maxn],p[maxn],sum[maxn];long long ans;bool vis[maxn];void get_mu(){ memset(vis,1,sizeof(vis)); mu[1]=1; for(int i=2;i<=N;i++){ if(vis[i]) p[++p[0]]=i, mu[i]=-1; for(int j=1;j<=p[0]&&i*p[j]<=N;j++){ vis[i*p[j]]=false; if(i%p[j]==0){ mu[i*p[j]]=0; break; } mu[i*p[j]]=-mu[i]; } }}int main(){ freopen("bzoj2820.in","r",stdin); freopen("bzoj2820.out","w",stdout); get_mu(); for(int i=1;i<=p[0];i++) for(int j=1;p[i]*j<=N;j++) sum[p[i]*j]+=mu[j]; for(int i=1;i<=N;i++) sum[i]+=sum[i-1]; scanf("%d",&_test); while(_test--){ scanf("%d%d",&n,&m); if(n>m) swap(n,m); ans=0; for(int i=1,nxt=0;i<=n;i=nxt+1){ nxt=min(n/(n/i),m/(m/i)); ans+=((long long)n/i)*(m/i)*(sum[nxt]-sum[i-1]); } printf("%lld\n",ans); }}
阅读全文
0 0
- [莫比乌斯反演+分块求和] BZOJ2820: YY的GCD
- 【bzoj2820】YY的GCD 线性筛法+莫比乌斯反演+数论分块
- bzoj2820: YY的GCD 莫比乌斯反演
- 【莫比乌斯反演】[BZOJ2820]YY的GCD
- 【bzoj2820】YY的GCD 莫比乌斯反演
- 【bzoj2820】【YY的gcd】【莫比乌斯反演】
- Bzoj2820:YY的GCD:莫比乌斯反演
- [BZOJ2820]YY的GCD(莫比乌斯反演)
- [bzoj2820]YY的GCD 莫比乌斯反演
- 【莫比乌斯反演】BZOJ2820 YY的GCD
- bzoj2820 YY的GCD【莫比乌斯反演】
- BZOJ2820 YY的GCD 莫比乌斯反演
- BZOJ2820 YY的GCD 【莫比乌斯反演】
- bzoj2820 [bzoj2820]YY的GCD(线性素数筛+莫比乌斯反演)
- 莫比乌斯反演练习bzoj2440;bzoj2301;bzoj2820 YY的GCD
- [BZOJ2820]YY的GCD(莫比乌斯反演+线性筛)
- 【莫比乌斯函数+除法分块】BZOJ2820[YY的GCD]题解
- Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)
- 算法导论<学习笔记> 第一章 算法在计算中的作用
- 13.4. A Copy-Control Example
- 有关献血过程中的一些问题
- xss跨站脚本攻击、csrf跨站请求伪造
- 用媒体查询实现web响应式开发小记
- [莫比乌斯反演+分块求和] BZOJ2820: YY的GCD
- Please use the /MD switch for _AFXDLL builds
- 类型别名的一些问题
- ScrollView嵌套RecycleView之后 recycleView惯性消失
- spring学习笔记(1)
- windows跨进程共享
- nmap基本使用方法
- c++的运算符的重载的代码
- NSValue的使用