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.
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.
For each test case there should be single line of output answering the question posed above.
7 12 0
6 4
求欧拉函数。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int MAXN = 1e5+7;
bool vis[MAXN];
int prim[MAXN];
int tot;
void get_prim()
{
for(int i = 2; i < MAXN; ++i)
{
if(!vis[i])prim[tot++] = i;
for(int j = 0; j < tot; ++j)
{
if(prim[j]*i > MAXN)break;
vis[i*prim[j]] = 1;
if(i%prim[j] == 0)break;
}
}
}
int get_phi(int x)
{
int ans = x;
for(int i = 0; i < tot; ++i)
{
int p = prim[i];
if(x%p == 0)
{
ans = ans/p*(p-1);
while(x % p ==0)x/=p;
}
}
if(x > 1)ans = ans/x*(x-1);
return ans;
}
int main()
{
get_prim();
int n;
while(~scanf("%d",&n)&&n)
{
printf("%d\n",get_phi(n));
}
return 0;
}