POJ 1284 Primitive Roots

Posted tyh-tyh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1284 Primitive Roots相关的知识,希望对你有一定的参考价值。

Primitive Roots
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 5481   Accepted: 3101

Description

We say that integer x, 0 < x < p, is a primitive root modulo odd prime p if and only if the set { (xi mod p) | 1 <= i <= p-1 } is equal to { 1, ..., p-1 }. For example, the consecutive powers of 3 modulo 7 are 3, 2, 6, 4, 5, 1, and thus 3 is a primitive root modulo 7.
Write a program which given any odd prime 3 <= p < 65536 outputs the number of primitive roots modulo p.

Input

Each line of the input contains an odd prime numbers p. Input is terminated by the end-of-file seperator.

Output

For each p, print a single number that gives the number of primitive roots in a single line.

Sample Input

23
31
79

Sample Output

10
8
24

我觉得丧心病狂的是读了很久题才看懂意思(英语太渣了。。)再一看题目,原根。。好吧,就当进一步理解原根了吧。
原根定义:设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
假设一个数g是P的原根,那么g^i mod P的结果两两不同,且有 1< g< P, 0< i < P,归根到底就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立.(这里P是素数).
简单来说,g^i mod p ≠ g^j mod p (p为素数)
其中i≠j且i, j介于1至(p-1)之间
则g为p的原根。
用两次欧拉函数就ok了。
技术分享图片
 1 #include <cstdlib>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include<iostream>
 6 #include <cmath>
 7 #include<string>
 8 #define ll long long 
 9 #define dscan(a) scanf("%d",&a)
10 #define mem(a,b) memset(a,b,sizeof a)
11 using namespace std;
12 #define MAXL 1105
13 #define Endl endl
14 #define maxn 1000005
15 ll x,y;
16 inline ll read()
17 {
18     ll x=0,f=1;char ch=getchar();
19     while(ch<0||ch>9) {if(ch==-) f=-1;ch=getchar();}
20     while(ch>=0&&ch<=9) {x=10*x+ch-0;ch=getchar();}
21     return x*f;
22 }
23 int euler(int n)
24 {
25      int i;
26      int res = n,a = n;
27      for(i = 2;i*i <= a; ++i)
28      {
29          if(a%i == 0)
30          {
31              res -= res/i; 
32              while(a%i == 0) a/=i;
33          }
34      }
35      if(a > 1) res -= res/a;
36      return res;
37 }
38 int main()
39 {
40     int n;
41     while(cin>>n)
42     {
43        cout<<euler(euler(n))<<endl;
44     }
45     return 0;
46 }
View Code

 

以上是关于POJ 1284 Primitive Roots的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1284 Primitive Roots

POJ1284 Primitive Roots (原根)

POJ1284:Primitive Roots——题解

poj1284Primitive Roots 欧拉函数

poj1284-Primitive Roots欧拉函数-奇素数的原根个数

原根二连 HDU 4992 && poj 1284 Primitive Roots