Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
Input
一个整数N
Output
如题
Sample Input
4
Sample Output
4
HINT
hint
对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
Source
湖北省队互测
题解:
要求
gcd(x,y)==p
那么就是求
gcd(x/p,y/p)==1
也就是对于每个p求
2∗∑i=1n/pphi[i]
又因为
gcd(p,p)==p
所以最后答案就是
∑p((2∗∑i=1n/pphi[i])+1)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=10000000+10;
int prime[maxn];
int phi[maxn];
ll sum[maxn];
int vis[maxn];
int n;
int ps=0;
inline void get_prime(int x){
for(int i=2;i<=x;i++){
if(!vis[i]){
phi[i]=i-1;
prime[++ps]=i;
}
for(int j=1;j<=ps&&i*prime[j]<=x;j++){
vis[i*prime[j]]=1;
if(i%prime[j])
phi[i*prime[j]]=phi[i]*(prime[j]-1);
else {
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
}
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
int n;
scanf("%d",&n);
get_prime(n);
for(int i=2;i<=n;i++)
sum[i]=sum[i-1]+phi[i];
ll ans=0;
for(int i=1;i<=ps;i++)
ans+=sum[n/prime[i]];
printf("%lld\n",ans*2+ps);
return 0;
}