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 }