点击打开题目
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
Sample Output
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;
}