题目链接<https://www.lydsy.com/JudgeOnline/problem.php?id=2818>
题意:
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对。
题解:
对于gcd(x,y)== 1。则gcd(x*p,y*p)== p。
所以要求 gcd(x,y)== p,x<=n,,y<=n
相当于求 gcd(x,y)== 1,x<=n/p,y<=n/p
而对于后者,可以用欧拉筛求出。phi[x]*2 就代表1~x范围内gcd为1的对数。乘2的原因是(x,y)和(y,x)不同。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e7+7;
ll phi[N],pri[N],sum[N];
bool vis[N];
ll tot;
void init(){
memset(vis,false,sizeof(vis));
phi[1]=1;
for(ll i=2;i<N;i++){
if(!vis[i]){
pri[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&i*pri[j]<N;j++){
vis[i*pri[j]]=true;
if(i%pri[j]){
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
else{
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
}
}
sum[1]=1;
for(ll i=2;i<N;i++)
sum[i]=sum[i-1]+phi[i]*2;
}
int main(){
ll n;
init();
while(scanf("%lld",&n)!=EOF){
ll ans=0;
for(ll i=1;i<=tot&&pri[i]<=n;i++)
ans+=sum[n/pri[i]];
printf("%lld\n",ans);
}
}