HDU2588 GCD(欧拉函数)

题目问[1,n]中与n的gcd大于等于m的数的个数。

好难想。。。

假设x满足条件,那么gcd(x,n)=d>=m,而x/d与n/d一定互质。

又x<=n,所以x/d<=n/d。

于是gcd(x,n)=d的x个数就等于小于n/d且与n/d互质的个数,即phi(n/d)。

不同的d对应的x肯定会不重复,因为它们与n的gcd本来就不同。那么就是枚举最大公约数d,累加phi(n/d)就是答案了。

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int phi(int x){
 5     int y=x;
 6     for(int i=2; i*i<=x; ++i){
 7         if(x%i) continue;
 8         while(x%i==0) x/=i;
 9         y-=y/i;
10     }
11     if(x!=1) y-=y/x;
12     return y;
13 }
14 int main(){
15     int t,n,m;
16     scanf("%d",&t);
17     while(t--){
18         scanf("%d%d",&n,&m);
19         int res=0;
20         for(int i=1; i*i<=n; ++i){
21             if(n%i) continue;
22             int j=n/i;
23             if(i>=m) res+=phi(j);
24             if(i!=j && j>=m) res+=phi(i);
25         }
26         printf("%d\n",res);
27     }
28     return 0;
29 }

 

你可能感兴趣的:(HDU2588 GCD(欧拉函数))