求原根的。
哪些数有原根?
n = 1,2,4,p^r,2p^r。期中p为奇素数,r为任意的正整数。
原根的一些性质:
•一个数n如果有原根,那么有phi(phi(n))个 •高斯证明了: •一个数n的全体原根乘积模n余1 •一个数n的全体原根总和模n余μ(n-1)(莫比乌斯函数) #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 70000; int prim[MAXN],phi[MAXN]; bool vis[MAXN]; int tot; void get_phi() { phi[1] = 1; tot = 0; for(int i = 2; i < MAXN; ++i) { if(!vis[i]) { prim[tot++] = i; phi[i] = i-1; } for(int j = 0; j < tot; ++j) { if(prim[j]*i > MAXN)break; vis[i*prim[j]] = 1; if(i%prim[j] == 0) { phi[i*prim[j]] = phi[i] * prim[j]; break; } else phi[i*prim[j]] = phi[i]*phi[prim[j]]; } } } int main() { int n; get_phi(); while(~scanf("%d",&n)) { printf("%d\n",phi[phi[n]]); } return 0; }