GCD Again
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3583 Accepted Submission(s): 1575
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!
2 4 0
0 1
题目大意:
给你一个整数N,求范围小于N中的整数中,与N的最大公约数大于1的整数的个数。
思路:
典型的欧拉函数变形。欧拉函数φ(N)是用来求小于N的整数中,与N的最大公约数为1的数的个数。
那么此题的答案ans = N - φ(N) - 1。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int oula(int n)
{
int res=1,i;
for(i=2; i*i<=n; i++)
if(n%i==0)//i是素数
{
n/=i;//因为要算ni-1次方,所以在这先除一下
res*=i-1;
while(n%i==0)
{
n/=i;//n越来越小
res*=i;
}
}
if(n>1)
res*=n-1;
return res;
}
int main()
{
int n;
while(cin>>n&&n)
{
cout<<n-oula(n)-1<<endl;
}
return 0;
}