51nod1135 原根
http://www.51nod.com/Challenge/Problem.html#problemId=1135
原根
当\(a\)模\(m\)的阶为\(\varphi(m)\)时,称\(a\)为模\(m\)的一个原根
求解原根的方法:
在\([2,p-1]\)中依次枚举,若对于\(p-1\)的每个质因子\(p_i\),均不存在\(a^{\frac{p-1}{pi}}\equiv 1(\mod p)\),则\(a\)为\(p\)的原根
\(C++ Code:\)
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
bool flag;
int p,fp,cnt,kz[123456];
ll ksm(ll x,ll y)
{
ll ans=1;
while (y)
{
if (y&1)
ans=ans*x%p;
x=x*x%p;
y >>=1;
}
return ans;
}
int main()
{
scanf("%d",&p);
fp=p-1;
for (int i=2;i*i<fp;i++)
if (fp%i==0)
{
while (fp%i==0)
fp/=i;
kz[++cnt]=i;
}
for (int i=2;i<p;i++)
{
flag=true;
for (int j=1;j<=cnt;j++)
if (ksm(i,(p-1)/kz[j])==1)
{
flag=false;
break;
}
if (flag)
{
printf("%d\n",i);
return 0;
}
}
return 0;
}