博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod--1135 原根 (数论)
阅读量:5462 次
发布时间:2019-06-15

本文共 1572 字,大约阅读时间需要 5 分钟。

题目:

设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)

给出1个质数P,找出P最小的原根。
Input
输入1个质数P(3 <= P <= 10^9)
Output
输出P最小的原根。
Input示例
3
Output示例
2

分析:

原根的板子题了。

原根知识详解:

实现:

#include 
using namespace std;typedef long long LL;const int maxn = 100000 + 131;vector
Primes;bool Jug[maxn];void Make_Primes() { /// 素数打表 Primes.clear(); memset(Jug, false, sizeof(Jug)); for(LL i = 2; i <= maxn; ++i) { if(Jug[i] == false) { Primes.push_back(i); for(LL j = i + i; j <= maxn; j += i) Jug[j] = true; } }}vector
Pi;void GetPi(LL X) { /// 获得 x 的质因子 Pi.clear(); LL mx = Primes.size(); for(LL i = 0; i < mx && Primes[i] * Primes[i] <= X; ++i) { if(X % Primes[i] == 0) { Pi.push_back(Primes[i]); while(X % Primes[i] == 0) X /= Primes[i]; } } if(X > 1) Pi.push_back(X);}LL Pow(LL a, LL n, LL mod) { /// 快速幂取摸 LL ret = 1; while(n) { if(n & 1) ret = ret * a % mod; a = a * a % mod; n >>= 1; } return ret;}bool JugAx(LL tmp, LL P) { /// 判断 tmp 是否是 P 原根 for(int i = 0; i < Pi.size(); ++i) { if(Pow(tmp, (P-1)/ Pi[i], P) == 1) return false; } return true;}int main() { LL P; Make_Primes(); while(cin >> P) { GetPi(P-1); for(LL i = 2; i <= P-1; ++i) { if(JugAx(i, P)) { cout << i << endl; break; } } } return 0;}

转载于:https://www.cnblogs.com/aoxuets/p/5506835.html

你可能感兴趣的文章
考核题 6
查看>>
hadoop Datanode多目录配置
查看>>
一段获取windows环境变量的代码
查看>>
test
查看>>
MKReverseGeocoder 过时,IOS5中使用CLGeocoder
查看>>
@DataProvider Method 参数传递
查看>>
The Tao to Excellent 2
查看>>
Redis 命令
查看>>
Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)
查看>>
织梦仿站第一课
查看>>
java step1:基础知识3
查看>>
Hadoop 发行版本 Hortonworks 安装详解(二) 安装Ambari
查看>>
Vue系列之 => webpack结合vue使用
查看>>
JSR356标准Java WebSocket实现多人 or 单人聊天室demo
查看>>
PHP sha1()函数
查看>>
阿里云 EDAS-HSF 用户指南
查看>>
HashMap实现原理分析
查看>>
Symantec AntiVirus企业版联机客户机端卸载密码(转)
查看>>
jQuery中的ajax
查看>>
BPM实例分享:H3如何调试V3
查看>>