BZOJ2818 Gcd 欧拉函数
题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
题解:我们枚举素数p,后面的过程和BZOJ2705一样,不同的是我们限制x>=y,假定得到的答案是ans,那么实际上答案是2*ans-1(加上x<=y,x==y重复计算了)
#include <cmath> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define ll long long const int MAXN=10000000+2; ll phi[MAXN],prime[MAXN/10],cnt,N,ans; bool flag[MAXN]; void Euler(int n){ phi[1]=1; for(int i=2;i<=n;i++){ if(!flag[i]) prime[++cnt]=i,phi[i]=i-1; for(int j=1;j<=cnt && prime[j]*i<=n;j++){ flag[prime[j]*i]=1; if(!(i%prime[j])){ phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int main(){ cin >> N; Euler(N); for(int i=2;i<=N;i++) phi[i]+=phi[i-1]; for(int i=1;i<=cnt;i++) ans+=2*phi[N/prime[i]]-1; cout << ans << endl; return 0; }