POJ1284 Primitive Roots (积性函数)
原题链接:POJ1284
题意简述:定义一个概念原根(primitive root),给出p,求出p为模的原根数量。
解题思路: 原根是数论中的一个概念,有关定义和证明请看原根的性质以及如何求原根
代码实例:
#include<cstdio>
const int maxn = 1e5+10;
int v[maxn],phi[maxn],primes[maxn];
int cnt = 0;
void init(){
for(int i = 2;i < maxn;i++){
if(!v[i]){
primes[cnt++] = i;
v[i] = i;
phi[i] = i-1;
}
for(int j = 0;j < cnt;j++){
if(primes[j]*i >= maxn || primes[j] > v[i]) break;
v[i*primes[j]] = primes[j];
phi[i*primes[j]] = phi[i] *(i%primes[j] ? primes[j]-1:primes[j]);
}
}
}
int main(){
int n;
init();
while(scanf("%d",&n) != EOF){
printf("%d\n",phi[n-1]);
}
return 0;
}