HDU 2588 - GCD(欧拉函数)

 

GCD

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


 

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

 

 

Source

ECJTU 2009 Spring Contest

 

题意:求 i <= n  且 gcd(i,n)>= m 的 i 的个数

思路 :对于所有小于n的最大公约数值一定是n的因子,所以,我们枚举每个符合条件的因子将其欧拉函数累加起来就好了。

#include 
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-----------------"< 1) ans *= (n - 1);
	return ans ;
}

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld", &n , &m);
		ll ans = 0;
		for(int i = 1; i * i <= n ;i++){
			if(n % i != 0) continue;
			if(i >= m && i * i != n) 
				ans += Euler(n / i);
			if(n / i >= m)
				ans += Euler(i);
		}
		printf("%lld\n", ans );
	}
	return 0;
}

 

你可能感兴趣的:(HDU,数论)