51nod 1135 原根
题目链接:51nod 1135 原根
设 m 是正整数,a是整数,若a模m的阶等于φ(m),则称 a 为 模m的一个原根。(其中φ(m)表示m的欧拉函数)
阶:gcd(a,m)=1,使得成立的最小的 r,称为 a 对 模m 的 阶。
φ(m):在[1,m)的区间内与m互质的数的个数。
求模素数p的原根a的方法:
因为p为素数,所以φ(p)=p-1, 这题就是要找最小的a使得 a^(p-1)%p = 1 成立(根据费马小定理,该式一定成立),
先求p-1所有不同的 质因子 p1,p2…pm,
对任何整数 a ∈[1,p-1], 检验 a 是否为 p 的原根,
检验方法:a^((p-1)/p1),a^((p-1)/p2),...a^((p-1)/pm) 中是否存在一个 模p 等于 1 ,
存在的话 a 就不是 模p 的一个原根(即p-1就不是a对模p的阶),否则a就为原根。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long ll;
const int N = ;
int prime[N];//prime[0] 存的是素数的个数
int ppri[N];//p-1的质因子
void getPrime(){
CLR(prime , );
for(int i = ;i < N; i++){
if(!prime[i])
prime[ ++prime[] ] = i;
for(int j = ; j <= prime[] && prime[j] <= N / i; j++){
prime[ prime[j] * i ] = ;
if(i % prime[j] == ) break;
}
}
}
ll pow_m(ll a, ll n, ll m){
ll t = a % m;
ll r = ;
while(n > ){
if(n & )
r = r * t % m;
t = t * t % m;
n >>= ;
}
return r;
}
int divide(int n){//分解合数n的质因子
int cnt = ;
for(int i = ; prime[i] * prime[i] <= n; ++i){
if(n % prime[i] == ){
ppri[++cnt] = prime[i];
while(n % prime[i] == ){
n /= prime[i];
}
}
}
if(n > ) ppri[++cnt] = n;
return cnt;
}
int main(){
int p, i, a, t, f;
getPrime();
scanf("%d", &p);
int cnt = divide(p - );//p-1 的 质因子个数
for(a = ; a <= p - ; ++a){//原根从 2 到 p-1 枚举
f = ;
for(i = ; i <= cnt; ++i){
t = (p - ) / ppri[i];
if( pow_m(a, t, p) == ){
//存在a^((p-1)/ppr[i]) mod p = 1, 则 a 不是质数p的原根
f = ; break;
}
}
if(f){
printf("%d\n",a);
break;
}
}
return ;
}
51nod 1135 原根的更多相关文章
- 51nod 1135 原根(原根)
题意 题目链接 Sol 可以证明素数的原根不会超过他的\(\frac{1}{4}\) 那么预处理出\(P - 1\)的所有的质因数\(p_1, p_2 \dots p_k\),暴力判断一下,如果$\e ...
- 51nod 1135 原根 (数论)
题目链接 建议与上一篇欧拉函数介绍结合食用. 知识点:1.阶:a和模m互质,使a^d≡1(mod m)成立的最小正整数d称为a对模m的阶(指数) 例如: 2^2≡1(mod3),2对模3的阶为2; ...
- (数论)51NOD 1135 原根
设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m)表示m的欧拉函数) 给出1个质数P,找出P最小的原根. Input 输入1个质数P(3 <= P &l ...
- 51nod 1135 原根 就是原根...
%%% dalao Orz ,筛素数到sqrt(n),分解ϕ(p),依次枚举判断就好了 #include<cstdio> #include<cstring> #include& ...
- 51Nod 1135:元根(数论)
1135 原根 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m) ...
- 【51NOD】1135 原根
[题意]给定p,求p的原根g.3<=p<=10^9. [算法]数学 [题解]p-1= p1^a1 * p2^a2 * pk^ak,g是p的原根当且仅当对于所有的pi满足g^[ (p-1)/ ...
- 51 Nod 1135 原根
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m)表示m的欧拉函数) 给出1个质数P ...
- my题库
数论: 51nod 1240 莫比乌斯函数 51nod 1135 原根 图论: 51nod 1264 线段相交 51nod 1298 圆与三角形 dp: 数位dp: hdu 4734 51nod 10 ...
- Root(hdu5777+扩展欧几里得+原根)2015 Multi-University Training Contest 7
Root Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Su ...
随机推荐
- 【转】PHP实现连贯操作
[第一种方案 __call] 我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码. M('User')->where(array('id'=>1))->field( ...
- svg学习(四)circle
<circle> 标签 < <?xml version="1.0" standalone="no"?> <!DOCTYPE ...
- 隐藏,显示任务栏,桌面 C++代码
HWND desktop,task; desktop=FindWindow(L"ProgMan",NULL); task=FindWindow(L"Shell_TrayW ...
- The type XXX cannot be resolved. It is indirectly referenced from required .class files错误.....
遇到The type XXX cannot be resolved. It is indirectly referenced from required .class files错误.....,查找的 ...
- SQL Server 利用批量(batchsize)提交加快数据生成/导入
在最小化日志操作解析,应用的文章中有朋友反映生成测试数据较慢.在此跟大家分享一个简单的应用,在生成数据过程中采用批量提交的方式以加快数据导入. 此应用不光生成测试数据上,在BCP导入数据中,复制初始化 ...
- android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据
为了实现这个功能可折腾了我好久,先上一份代码,经楼主验证是绝对可以用的而且也比较清晰的代码!(ps:还是先剧透下吧,第三方大部分浏览器无法成功.) 点击浏览器中的URL链接,启动特定的App. 首先做 ...
- RecycleView可以策划的Item
public abstract class SwipeMenuViewHolder { /* 从左侧滑出菜单 */ public static final int EDGE_LEFT = 1; /* ...
- free查看可用缓存
本篇转自:http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html 解释一下Linux上free命令的输出. 下面是fr ...
- 腾讯数据总监:运营人员必须掌握的APP基础数据分析体系(没有比这篇更系统全面的)
导读:在互联网企业,任何一个APP都要事先规划好数据体系,才允许上线运营,有了数据才可以更好的科学运营.因此本文将为大家介绍APP的基础数据指标体系.主要分为五个维度,包括用户规模与质量.参与度分析. ...
- LeetCode算法题解
1.给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?(181) 解法一:举例说明,为了减少复杂度,就使用八位二进制吧. ...