poj1284 Primitive Roots

考虑互质的两个数a < n, a是n的原根当且仅当对任意的p < φ(n)有amod n ≠ 1(φ(n)是n的欧拉函数)。

也即等价于集合ap(p < φ(n)) 与n的简化剩余系相等。

判定a(< n)是否是n的原跟的方法:

计算φ(n)的质因数集合{p1, p2, ..., pk) , 若aφ(n)/pi mod n ≠ 1,则a是n的原根。

这样的a共有φ(φ(n))个。

 

http://poj.org/problem?id=1284

 

 

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4 int n;
 5 int prime[100], k;
 6 
 7 void solve(){
 8     int m = n - 1;
 9     k = 0;
10     if(m % 2 == 0){
11         prime[k++] = 2;
12         while(m % 2 == 0) m /= 2;
13     }
14     int mid = (int)sqrt(m);
15     for(int i = 3; i <= mid; i += 2){
16         if(m % i == 0){
17             prime[k++] = i;
18             while(m % i == 0) m /= i;
19             mid = (int)sqrt(m);
20         }
21     }
22     if(m != 1) prime[k++] = m;
23     int ans = n - 1;
24     for(int i = 0; i < k; i++) ans /= prime[i];
25     for(int i = 0; i < k; i++) ans *= prime[i] - 1;
26     printf("%d\n", ans);
27 }
28 
29 int main(){
30     while(~scanf("%d", &n)) solve();
31     return 0;
32 }
View Code

 

posted @ 2015-09-13 20:55  astoninfer  阅读(127)  评论(0编辑  收藏  举报