Do you have spent some time to think and try to solve those unsolved problem after one ACM contest?
No? Oh, you must do this when you want to become a "Big Cattle".
Now you will find that this problem is so familiar:
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 I am considering a little more difficult problem:
Given an integer N, please count the number of the integers M (0<M<N) which satisfies (N,M)>1.
This is a simple version of problem “GCD” which you have done in a contest recently,so I name this problem “GCD Again”.If you cannot solve it still,please take a good think about your method of study.
Good Luck!
No? Oh, you must do this when you want to become a "Big Cattle".
Now you will find that this problem is so familiar:
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 I am considering a little more difficult problem:
Given an integer N, please count the number of the integers M (0<M<N) which satisfies (N,M)>1.
This is a simple version of problem “GCD” which you have done in a contest recently,so I name this problem “GCD Again”.If you cannot solve it still,please take a good think about your method of study.
Good Luck!
Input
Input contains multiple test cases. Each test case contains an integers N (1<N<100000000). A test case containing 0 terminates the input and this test case is not to be processed.
Output
For each integers N you should output the number of integers M in one line, and with one line of output for each line in input.
Sample Input
2 4 0
Sample Output
0 1
输入一个数n,设 0 < m < n,n和m最大公约数大于1,输出一共有多少组m,
欧拉函数~~
ps:欧拉函数简单性质,一个数x的欧拉值>= y,则这个数最小值为y+1往后的第一个素数,
例:euler(x) >= 8,则x最小为11
#include<cstdio>
int gcd(int a)
{
int ans = a, i;
for(i = 2; i * i <= a; i++)
{
if(a % i == 0)
{
ans -= ans / i;
while(a % i == 0)
{
a /= i;
}
}
}
return a > 1 ? ans - ans / a : ans;//用欧拉函数求出所有互质的数,即所有最大公约数为1的数,再用总数减去
}
int main()
{
int n;
while(scanf("%d", &n) == 1 && n)
{
printf("%d\n", n - gcd(n) - 1);
}
}