bzoj2818 Gcd
来源:互联网 发布:金相分析仪 知乎 编辑:程序博客网 时间:2024/05/29 08:38
题目链接:bzoj2818
题目大意:
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
题解:
欧拉函数或莫比乌斯反演
设d∈[1,n]是一个质数。
原式即
套路一下:
额第三个求和是在枚举范围内的质数。
欧拉函数的做法就是化成:
然后看式子的后半部分,就是在求[1,n]中的与
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;#define maxn 10001000#define N 701000bool ispri[maxn];LL sum[maxn];int n,cnt,phi[maxn],pri[N];void Eular(int lim){ cnt=0;phi[1]=1; for (int i=2;i<=lim;i++) { if (!ispri[i]) {pri[++cnt]=i;phi[i]=i-1;} for (int j=1;j<=cnt && pri[j]*i<=lim;j++) { ispri[i*pri[j]]=true; if (i%pri[j]==0) { phi[i*pri[j]]=pri[j]*phi[i]; // mu[i*pri[j]]=0; break; } phi[i*pri[j]]=(pri[j]-1)*phi[i]; // mu[i*pri[j]]=-mu[i]; } }sum[0]=0; for (int i=1;i<=lim;i++) sum[i]=sum[i-1]+phi[i];}int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int n,i;LL ans=0; scanf("%d",&n); Eular(n); for (i=1;i<=cnt;i++) { int lim=n/pri[i]; ans+=sum[lim]*2-1; } printf("%lld\n",ans); return 0;}
莫比乌斯反演的做法我现在还不是很懂怎么化出来..先挖个坑
来填坑
莫比乌斯反演的做法则是化成:
把
反演一下:
即
实际上后半部分就是在求有多少对
所以式子就是:
预处理
懒得再打了。。
看这位dalao的吧,谢谢dalao的解疑。
0 0
- 【BZOJ2818】Gcd
- [BZOJ2818] Gcd
- [BZOJ2818]Gcd
- bzoj2818 Gcd
- [BZOJ2818]Gcd
- [bzoj2818]gcd
- [bzoj2818]gcd
- 【bzoj2818】Gcd
- BZOJ2818: Gcd
- bzoj2818 Gcd
- 【bzoj2818】Gcd
- bzoj2818: Gcd
- bzoj2818 Gcd
- BZOJ2818: Gcd
- BZOJ2818 Gcd
- 【bzoj2818】【GCD】【数论】
- bzoj2818: Gcd(第二次做)
- BZOJ2818 Gcd 素数筛+欧拉筛
- 慕课网js触发事件系列demo
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-模块管理按子系统进行分类管理
- Unity3D学习(5)之工厂回收利用的3D版飞碟游戏
- java解析excle映射为对象
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- bzoj2818 Gcd
- PHP之【变量的数据类型(重点是字符串和数组)】
- java代码中init method和destroy method的三种使用方式
- 微信小程序底部功能栏的实现代码
- UGUI中的Panel显示在最前面
- 欢迎使用CSDN-markdown编辑器
- 我不想认识你
- 计算你来到世界多少天
- 一.maven命令