GCD
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 897 Accepted Submission(s): 400
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.
(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
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <math.h> 5 6 using namespace std; 7 int fun(int n)//传入一数,返回此数的欧拉函数,用素数表会更快 8 { 9 int sum=n; 10 int i; 11 for(i=2; i*i<=n; i++) 12 { 13 if(n%i==0) 14 { 15 sum=sum/i*(i-1); 16 while(n%i==0)n/=i; 17 } 18 } 19 if(n!=1) 20 { 21 sum=sum/n*(n-1); 22 } 23 return sum; 24 } 25 26 int main() 27 { 28 int t,i,n,m,ans,size; 29 scanf("%d",&t); 30 while(t--) 31 { 32 scanf("%d%d",&n,&m); 33 ans=0; 34 size=sqrt(n+0.5); 35 for(i=1; i<=size; i++) 36 { 37 if(n%i==0) 38 { 39 if(i>=m) 40 ans+=fun(n/i); 41 if(i!=n/i&&n/i>=m)ans+=fun(i); 42 } 43 } 44 printf("%d ",ans); 45 } 46 }
Source