BZOJ 2818GCD
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
题解
gcd(a,b)=p 则 gcd(a/p,b/p)=1;
设 a<=b 则gcd(a,b)=phi[b](与b互质的个数)
所以只需要枚举每一个素数,每一个数(这里可以用n的前缀和来维护,记为f[n])求解出ans=Σf[n/prime[i]]*2-1(考虑a>b,并减去(1,1)之类的值)
1 #include<cstdio> 2 const int maxn=10000010; 3 bool pd[maxn]; 4 long long phi[maxn],prime[maxn],top,n,ans; 5 void ES(){ 6 for(int i=2;i<n;i++){ 7 if (!pd[i]){ 8 prime[++top]=i; 9 phi[i]=i-1; 10 } 11 for (int j=1;j<=top&&prime[j]*i<=n;j++){ 12 pd[prime[j]*i]=1; 13 if (i%prime[j]==0){ 14 phi[prime[j]*i]=phi[i]*prime[j]; 15 break; 16 } 17 phi[prime[j]*i]=phi[i]*(prime[j]-1); 18 } 19 } 20 } 21 22 int main(){ 23 scanf("%lld",&n); 24 ES(); 25 for(int i=1;i<n;i++) phi[i]+=phi[i-1]; 26 for (int i=1;i<=top;i++) ans+=phi[n/prime[i]]*2+1; 27 printf("%lld",ans); 28 }