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 <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int v[maxn];
int main()
{
int t,n;
while(scanf("%d",&t) && t)
{
int s = 1; n = t;
for (int i = 2;i * i <= t;)
{
int k=0;
while(t%i == 0)//找公因子
{
if(!k)//巧妙,比如12,第二次除以2时,不用执行
{
k = 1;
v[s++] = i;
}
t /= i;
}
if ( i == 2 ) i++;
else i += 2;
//i++;
}
ll sum = 0;
if (t != 1) v[s++] = t; s -= 1;//ss是公因子个数
for (int i = 1;i < (1 << s);i++)
{
ll cnt = 0,tmp = 1;
for (int j = 1; j <= s ;j++)//?????j=1
{
if ( i >> (j-1) & 1 )
{
cnt++;
tmp = tmp * v[j];//与n有公因子的数
}
}
if(cnt & 1) sum += n / tmp;
else sum -= n / tmp;
}
printf("%d\n",n - sum);
}
return 0;
}
/* 题目要求1..n-1中与n互质的数的个数 */
//ll gcd(ll a,ll b){
// if(b == 0){
// return a;
// } else {
// return gcd(b,a%b);
// }
//}
//
//ll lcm(ll a,ll b){
// return a / gcd(a,b) * b;
//}