给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.ios
比较水的题目,若是不是质数,必须得用到 \(O(n\sqrt{n})\)的容斥,可是若是gcd为质数那么存在不少性质....
咱们枚举每个质数,枚举每个倍数,而后加上 \(phi\) 便可,若是不是倍数不是1,还须要乘以2,样例能够看出spa
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #define RG register #define il inline #define iter iterator #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; const int N=10000005; int n,prime[N],num=0,phi[N];bool vis[N]; void priwork(){ phi[1]=1; for(int i=2;i<=n;i++){ if(!vis[i])prime[++num]=i,phi[i]=i-1; for(int j=1;j<=num && i*prime[j]<=n;j++){ int to=i*prime[j];vis[to]=1; if(i%prime[j]==0){phi[to]=phi[i]*prime[j];break;} else phi[to]=phi[i]*(prime[j]-1); } } } void work() { cin>>n; priwork(); ll ans=0; for(int i=1;i<=num;i++){ int lim=n/prime[i]; for(int j=1;j<=lim;j++){ if(j==1)ans+=phi[j]; else ans+=phi[j]<<1; } } printf("%lld\n",ans); } int main() { work(); return 0; }