給定整數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; }