hdu 2588 GCD(欧拉函数)
题目链接:hdu 2588 GCD
题意:给定N,M(2<=N<=1000000000, 1<=M<=N), 求1<=X<=N 且gcd(X,N)>=M的个数。
解法:先找出N的约数x,并且gcd(x,N)>= M,结果为所有N/x的欧拉函数之和。
因为x是N的约数,所以gcd(x,N)=x >= M;
设y=N/x,y的欧拉函数为小于y且与y互质的数的个数。
设与y互质的的数为p1,p2,p3,…,p4
那么gcd(x* pi,N)= x >= M。
也就是说只要找出所有符合要求的y的欧拉函数之和就是答案了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 5 int Eular(int n) 6 { 7 int ret = 1, i; 8 for (i = 2; i*i <= n; i++) 9 { 10 if (n%i == 0) 11 { 12 n /= i, ret *= i - 1; 13 while (n%i == 0)n/= i,ret *= i; 14 } 15 } 16 if (n>1)ret *= n - 1; 17 return ret; 18 } 19 20 int t,a,b; 21 22 int main() 23 { 24 scanf("%d",&t); 25 while(t--) 26 { 27 scanf("%d%d",&a,&b); 28 int ans=0; 29 for(int i=1;i*i<=a;++i) 30 if(a%i==0) 31 { 32 if(i>=b)ans+=Eular(a/i); 33 if(a/i!=i&&a/i>=b)ans+=Eular(i); 34 } 35 printf("%d\n",ans); 36 } 37 return 0; 38 }