POJ1284 Primitive Roots (原根)
题目链接:http://poj.org/problem?id=1284
题目描述:
题目大意:
一个质数原根的个数
题解:
结论题
一个数n的原根的个数等于$\varphi(\varphi(n))$
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=65536+15; int p,tot; int vis[N],prime[N],phi[N]; void get_phi() { phi[1]=1; for (int i=2;i<=N;i++) { if (!vis[i]) { prime[++tot]=i; phi[i]=i-1; } for (int j=1;j<=tot&&prime[j]*i<=N;j++) { vis[prime[j]*i]=1; if (i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int main() { get_phi(); while (scanf("%d",&p)!=EOF) { printf("%d\n",phi[p-1]); } return 0; }
星星之火,终将成燎原之势