bzoj 2818: Gcd 线性筛求欧拉函数

来源:互联网 发布:莫言生死疲劳淘宝 编辑:程序博客网 时间:2024/06/05 19:44

题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.


分析:线性筛和用线性筛求欧拉函数链接:http://blog.csdn.net/nk_test/article/details/46242401

那么这题其实就是枚举每个素数作为gcd(x,y)然后求[1,n/prime]的范围内有多少互质的数对(x,y),那么这个其实就是欧拉函数的前缀和。


代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define ll long long#define N 10000005using namespace std;int n,tot,prime[N],not_prime[N];ll phi[N];void getphi(int n){phi[1]=1;for (int i=2;i<=n;i++){if (!not_prime[i]){prime[++tot]=i;phi[i]=i-1;}for (int j=1;j<=tot&&prime[j]*i<=n;j++){not_prime[i*prime[j]]=1;if (i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}phi[i*prime[j]]=phi[i]*(prime[j]-1);}}}int main(){scanf("%d",&n);getphi(n);for (int i=2;i<=n;i++)phi[i]+=phi[i-1];ll ans=0;for (int i=1;i<=tot;i++)ans+=phi[n/prime[i]];printf("%lld",ans*2-tot);return 0;}


0 0
原创粉丝点击