给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的,数对(x,y)有多少对. N<=10000000
f[i] 表示 1~i中 1<=x,y<=i 且(x,y)=1个对数的个数
显然 f[i] = 1+2* sigma(phi[j]) 1<j <= i
ans = sigma(f[N/p]) p为小于N的素数
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10000000+10;
int prime[N/3],phi[N],cnt = 0;
bool flag[N];
int n ;
long long f[N];
void get_prime()
{
cnt=0;
memset(flag,false,sizeof(flag));
for(int i=2;i<N;++i)
{
if(!flag[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0; j<cnt && i*prime[j] < N ; ++j)
{
flag[i*prime[j]]=true;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
int main()
{
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
get_prime();
cin>>n;
f[1] = 1;
for (int i = 2; i <= n;++i) f[i]=f[i-1]+2*phi[i];
long long ans = 0;
for (int i = 0; i < cnt ; ++i)
if (prime[i] < n)
ans += f[n/prime[i]];
cout << ans << endl;
return 0;
}