Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.N≤10000000
1<=x,y<=N且Gcd(x,y)为质数等价于Gcd(x/p,y/p)=1,p为质数,
线性筛求1~n的欧拉函数值和质数表,
对欧拉函数求前缀和,枚举质数计算x/p<y/p的情况,结果乘二(加上x/p>y/p的情况),
最后加上x=y=p的情况
#include <cstdio> bool isnp[10000001]={1,1}; int N=10000000,phi[10000001]={0,0}; int ps[1000000],p=0; int n=0; long long as[10000001],ans=0; int main(){ int i; scanf("%d",&n); for(i=2;i<=n;i++){ if(!isnp[i])ps[p++]=i,phi[i]=i-1; for(int j=0;j<p&&i*ps[j]<=N;j++){ isnp[i*ps[j]]=1; if(i%ps[j])phi[i*ps[j]]=phi[i]*(ps[j]-1); else{ phi[i*ps[j]]=phi[i]*ps[j]; break; } } } for(i=1;i<=n;i++)as[i]=as[i-1]+phi[i]; for(i=0;i<p&&ps[i]<=n;i++)ans+=as[n/ps[i]]; printf("%lld",ans+ans+i); return 0; }