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
#include <stdio.h>
long long prim[1000000];
long long qwe(long long t,long long m) //m表示质因数的个数
{
long long ans=0,i,j;
for(i=1;i<(1<<m);i++)//2^m次方 假如质因数为 2 3对应的情况1代表选取,0表示不选
// 0 0
// 0 1
// 1 0
{ // 1 1
long long tmp=1,flag=0;
for(j=0;j<m;j++)
{
if(i>>j&1) //这个就是选与不选(即为i>>j==1时选取)
{
tmp*=prim[j];//1.tmp 就是质因数的组合和ans/tmp 是包含排斥原理的关键
//就和离散数学学一样
flag++;
}
}
if(flag&1) ans+=t/tmp;//2.包含排斥原理奇加偶减
else ans-=t/tmp; //3.A+B+C-AB-AC-BC+ABC;
}
return ans;
}
int main()
{
long long n,i,j,m,t;
scanf("%lld",&n);
while(n)
{
m=0;
t=n;
for(i=2;i*i<=n;i++)
{
if(n&&n%i==0)//求质因数
{
prim[m++]=i;
}
while(n%i==0)
{
n=n/i;
}
}
if(n>1) prim[m++]=n;//注意N>1 时
printf("%lld\n",t-qwe(t,m));
scanf("%lld",&n);
}
return 0;
}