hdu2588-GCD-(欧拉函数+分解因子)

The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the largest divisor common to a and b,For example,(1,2)=1,(12,18)=6. 
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem: 
Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.

InputThe first line of input is an integer T(T<=100) representing the number of test cases. The following T lines each contains two numbers N and M (2<=N<=1000000000, 1<=M<=N), representing a test case.OutputFor each test case,output the answer on a single line.Sample Input

3
1 1
10 2
10000 72

Sample Output

1
6
260
翻译:给出n和m,1<=x<=n,求x符合gcd(x,n)>=m有多少个。
解题过程:
令d=gcd(x,n),显然d是n的因子,并且是x和n的最大公因子,则gcd(x/d,n/d)=1
对于每个d,令y=n/d,找有多少个x/d满足gcd(x/d,y)=1。
欧拉函数登场,累加y的欧拉函数值。
 1 #include <iostream>
 2 #include<stdio.h>
 3 #include <algorithm>
 4 #include<string.h>
 5 #include<cstring>
 6 #include<math.h>
 7 #define inf 0x3f3f3f3f
 8 #define ll long long
 9 using namespace std;
10 
11 ll euler(ll x)
12 {
13     ll res=x;
14     for(ll i=2;i*i<=x;i++)
15     {
16         if(x%i==0)
17         {
18             res=res/i*(i-1);
19             while(x%i==0)
20                x=x/i;
21         }
22     }
23     if(x>1)
24         res=res/x*(x-1);
25     return res;
26 }
27 
28 int main()
29 {
30 
31     ll t,n,m,sum;
32     scanf("%lld",&t);
33     while(t--)
34     {
35         sum=0;
36         scanf("%lld%lld",&n,&m);
37         int q=sqrt(n);
38         ll i;
39         for(i=1;i*i<=n;i++)
40         {
41             if(n%i==0)
42             {
43                 if(i>=m)
44                     sum=sum+euler(n/i);
45                 if((n/i)>=m)
46                     sum=sum+euler(i);
47             }
48         }
49         i--;
50         if(i*i==n && i>=m) 
51             sum=sum-euler(i);
52         printf("%lld\n",sum);
53     }
54     return 0;
55 }

 



posted @ 2019-02-13 22:11  守林鸟  阅读(255)  评论(0编辑  收藏  举报