Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz.
Input
There are several test cases. For each test case, standard input contains a line with n <= 1,000,000,000. A line containing 0 follows the last case.
Output
For each test case there should be single line of output answering the question posed above.
Sample Input
7
12
0
Sample Output
6
4
/*
这道题是对容斥原理,还有算数基本定理,先说一下容斥定理
容斥定理是在有集合的概念并且集合之间有交集,目的是求交集的情况下才可以用,
这个代码用的是二进制枚举,它能把所有的选择情况都枚举出来(以二进制的形式)
并且用寄加偶减的原则
算数基本定理的思想:把构成n的所有质数求出来
并且有一个逆向思维,先求能除尽的,然后减去,就是不能除尽的
*/
#include <iostream>
using namespace std;
int k;
int p[10000];
void pr(int n) //求n的质因子
{
k=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
p[k++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1) p[k++]=n;
}
int main()
{
int i,ans,cnt,j;
int n;
while(cin>>n && n!=0)
{
ans=0;
int res=1;
pr(n);
for(i=1;i<(1<<k);i++) //所有的情况,相当于2^k
{
cnt=0; res=1;
for(j=0;j<k;j++) //遍历每个集合是否被选上
{
if(1&(i>>j)) //选上
{
cnt++;
res*=p[j];
}
}
if(cnt&1) //奇加偶减
ans+=n/res;
else
ans-=n/res;
}
cout<<n-ans<<endl;
}
}