从来没有接触过完全剩余系,不会证明,知道看了别人的题解才知道要用欧拉函数;
下面是证明过程:
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 }