码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1284 Primitive Roots

时间:2018-07-27 17:28:37      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:center   eve   read   time   line   root   single   假设   ali   

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

标签:center   eve   read   time   line   root   single   假设   ali   

原文地址:https://www.cnblogs.com/TYH-TYH/p/9378647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!