题目大意:
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
思路:
这题可以用欧拉函数或莫比乌斯反演解,新萌不会莫比乌斯所以随手打了一个欧拉函数。。。
只需要枚举不同种类的素数,然后GCD(X,Y)==D == GCD(X/D,Y/D)==1 代价是一样的。就变成x,y有多少对互质的。然后线性塞一下欧拉函数就ok了
程序:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10000005
using namespace std;
int pri[N],n,tot;
bool mark[N];
long long sum[N],phi[N];
void getphi(){
phi[1]=1;
for (int i=2;i<=n;i++){
if (!mark[i]) {phi[i]=i-1; pri[++tot]=i;}
for (int j=1;j<=tot;j++){
int x=pri[j];
if (i*x>n) break;
mark[x*i]=1;
if (i%x==0) {phi[i*x]=phi[i]*x; break;}
else phi[i*x]=phi[i]*phi[x];
}
}
}
int main(){
long long ans=0;
tot=0;
scanf("%d",&n);
getphi();
for (int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
for (int i=1;i<=tot;i++) ans+=sum[n/pri[i]]*2-1;
printf("%lld",ans);
}