hdoj-2588-GCD

来源:互联网 发布:培训用什么域名好 编辑:程序博客网 时间:2024/06/06 01:50

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

找到满足,gcd(x,n)>=m的数的个数

gcd(x,n)=d,d>=m,所以记录下每一个能被n整除的并且大于m的数,然后计算他们的欧拉函数值,便是答案了n=p*d,x=q*d,p和q互质

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>using namespace std;const int maxn=10000005;int a[maxn];int euler(int n){    int m=(int)sqrt(n+0.5);    int ans=n;    for(int i=2;i<=m;i++)        if(n%i==0)    {        ans=ans/i*(i-1);        while(n%i==0) n/=i;    }    if(n>1) ans=ans/n*(n-1);    return ans;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        int t=0;        for(int i=1;i*i<=n;i++)        {            if(n%i==0)            {                if(i>=m) a[t++]=n/i;                if(n/i>=m&&(n/i)!=i) a[t++]=i;            }        }        int sum=0;        for(int i=0;i<t;i++) sum+=euler(a[i]);        printf("%d\n",sum);    }    return 0;}
0 0