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的欧拉函数之和就是答案了。

 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 }
View Code

 

posted @ 2016-12-20 16:22  bin_gege  阅读(181)  评论(0编辑  收藏  举报