poj 1284 Primitive Roots

从来没有接触过完全剩余系,不会证明,知道看了别人的题解才知道要用欧拉函数;

下面是证明过程:

p是奇素数,如果{xi%p | 1 <= i <= p - 1} = {1,2,...,p-1},则称x是p的原根.

给出一个p,问它的原根有多少个.

 {xi%p | 1 <= i <= p - 1} = {1,2,...,p-1} 等价于 {xi%(p-1) | 1 <= i <= p - 1} = {0,1,2,...,p-2},即为(p-1)的完全剩余系

若x,x2...x(p-1)是(p-1)的完全剩余系,

根据定理,可以推出若gcd(x, p-1) = 1时, (1,x,...,x(p-2))也是(p-1)的完全剩余系

因为若xi != xj (mod p-1),那么x*xi != x*xj (mod p-1),与条件m矛盾,所以 xi = xj (mod p-1),

由此可以确定答案为EulerPhi(p-1);

证明过程来自:http://www.cnblogs.com/Saatgut/archive/2008/10/09/1307233.html

我的代码:

 1 #include<cstdio>
 2 using namespace std;
 3 const int maxn=65540;
 4 int phi[maxn]={0};
 5 void phi_table()
 6 {
 7     int i,j;
 8     phi[1]=i;
 9     for(i=2;i<maxn;i++)
10     {
11         if(!phi[i])
12             for(j=i;j<maxn;j+=i)
13             {
14                 if(!phi[j])
15                     phi[j]=j;
16                 phi[j]-=phi[j]/i;
17         }
18     }
19 }
20 int main()
21 {
22     int n;
23     phi_table();
24     while(scanf("%d",&n)!=EOF)
25     {
26         printf("%d
",phi[n-1]);
27     }
28     return 0;
29 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3280095.html