http://poj.org/problem?id=1284
原根
一个质数的原根个数为\(\varphi(p-1)\)
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 100005
using namespace std;
int x;
bool pri[N];
int cnt,phi[N],prime[N];
int main()
{
phi[1]=1;
for (int i=2;i<=65536;i++)
{
if (!pri[i])
{
prime[++cnt]=i;
phi[i]=i-1;
}
for (int j=1;j<=cnt;j++)
{
ll g=(ll)i*prime[j];
if (g>65536)
break;
pri[g]=true;
if (i%prime[j]==0)
{
phi[g]=phi[i]*prime[j];
break;
}
phi[g]=phi[i]*(prime[j]-1);
}
}
while (scanf("%d",&x)!=EOF)
printf("%d\n",phi[x-1]);
return 0;
}