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 }

 

posted @ 2016-01-09 12:31  Alisahhh  阅读(129)  评论(0编辑  收藏  举报