0
点赞
收藏
分享

微信扫一扫

hdu 2588 GCD

RIOChing 2022-12-02 阅读 29




GCD

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 979    Accepted Submission(s): 439


Problem Description


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.


 




Input


The 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.


 




Output


For each test case,output the answer on a single line.


 




Sample Input


3 1 1 10 2 10000 72


 




Sample Output


1 6 260


//eular函数 
/*题解:找出所有(x,n)>=m中的大于m的n的因子,x1,x2,x3... 令k=n/i;
找出所有与k互质且小于k的数y,则gcd(ay;ak)=a;
将所有n/eular (k)相加即得结果;
*/
#include<cstdio>
int eular(int n)
{
int i,ret=1;
for(i=2; i*i<=n; i++)
{
if(n%i==0) n/=i,ret*=i-1;
while(n%i==0) n/=i,ret*=i;
}
if(n>1)
ret*=n-1;
return ret;
}

int main()
{
int T,m,n,i;
scanf("%d",&T);
while(T--)
{
int s=0,num[100010]={0},cnt=0;
scanf("%d %d",&n,&m);
for(i=1; i*i<=n; i++)
{
if(n%i==0)
{
if(i>=m&&i*i!=n) num[cnt++]=i;
if(n/i>=m&&i*i!=n) num[cnt++]=n/i;
if(i*i==n&&i>=m) num[cnt++]=i;
}
}


         for(i=0; i<cnt; i++)
         s+=eular(n/num[i]);
         printf("%d\n",s);
       }
    return 0;
}

/*错误代码: 超时
#include<stdio.h>
int gcd(int a,int b){
    return !b?a:gcd(b,a%b);
}
int main()

{
    int T;
    scanf("%d",&T);
    while(T--)

    {
            int i,n,m,count;
            scanf("%d %d",&n,&m);
            for(i=1,count=0; i<=n; i++)

             {
                 if(gcd(i,n)>=m)
                  count++;
             }
        printf("%d\n",count);
      }
    return 0;
}*/
       

举报

相关推荐

0 条评论