BZOJ2818: Gcd 欧拉函数求前缀和
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的
然后找到所有的素数,然后用欧拉函数求一下前缀和就行
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 1e7+5; const int INF=0x3f3f3f3f; typedef unsigned long long ULL; typedef long long LL; bool check[N]; int phi[N],prime[N],tot,n; LL sum[N]; int main(){ scanf("%d",&n); phi[1]=1;tot=0; for(int i=2;i<=n;++i){ if(!check[i]){ prime[++tot]=i; phi[i]=i-1; } for(int j=1;j<=tot;++j){ if(i*prime[j]>n)break; check[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); } } for(int i=1;i<=n;++i) sum[i]=sum[i-1]+phi[i]; LL ans=0; for(int i=1;i<=tot;++i) ans+=2*sum[n/prime[i]]-1; printf("%lld\n",ans); return 0; }