【HDU】2588 - GCD(欧拉函数)

点击打开题目

GCD

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


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
 



跟上一篇博客的分析差不多,就是需要多判断条件,只取大于等于 m 的因子。


代码如下:

#include 
int Eular(int n)
{
	int ans = n;
	for (int i = 2 ; i * i <= n ; i++)
	{
		if (n % i == 0)
		{
			ans -= ans / i;
			while (n % i == 0)
				n /= i;
		}
	}
	if (n > 1)
		ans -= ans / n;
	return ans;
}
int main()
{
	int n,m;
	int u;
	__int64 ans;
	scanf ("%d",&u);
	while (u--)
	{
		ans = 0;
		scanf ("%d %d",&n,&m);
		int i;
		for (i = 1 ; i * i < n ; i++)
		{
			if (n % i == 0)
			{
				if (i >= m)
					ans += Eular(n/i);
				if (n / i >= m)
					ans += Eular(i);
			}
		}
		if (i * i == n && i >= m)
			ans += Eular(i);
		printf ("%I64d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(欧拉函数)