51Nod-1135-原根
2019-04-14 20:26发布
生成海报
1135 原根
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1135
题目:
设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
题意:给定一个质数,求最小原根。
题解:此题需要用到的公式及概念有,P为质数,则phi(p)=p-1;
a模m的阶及即满足a^r≡(1 mod m)的最小r;
存在定理:若p-1因分解p1,p2...pk,若a^((p-1)/pi)%p!=1,对1<=i<=k均成立,则a为p的原根,所以枚举 a,找到最小的a即可,注意数据范围会爆int。
AC代码:
/*
* @Author: 王文宇
* @Date: 2017-10-21 01:36:04
* @Last Modified by: 王文宇
* @Last Modified time: 2017-10-21 03:01:35
*/
#include
#include
using namespace std;
const int maxn = 1e7;
#define ll long long
ll p,t;
ll is[maxn];
void pr(int n)
{
t=1;
for(int i=2;i<=sqrt(n+0.5);i++)
{
if(n%i==0)
{
is[t++]=i;
while(n%i==0)n/=i;
}
if(n==1)break;
}
if(n>1)is[t++]=n;
}
ll mi(ll a,ll b,ll c)
{
ll ans =1;
if(b==0)return 1;
ans=mi(a,b/2,c);
ans=ans*ans%c;
if(b&1)ans=ans*a%c;
return ans;
}
int main()
{
ll p;
scanf("%lld",&p);
pr(p-1);
ll i;
ll ok;
for(i=2;i<=p;i++)
{
ok=1;
for(ll j=1;j
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮