设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
给出1个质数P,找出P最小的原根。
输入
输入1个质数P(3 <= P <= 10^9)
输出
输出P最小的原根。
输入样例
3
输出样例
2
a是p的原根满足:p-1的所有质因子p1,p2,…,pk,都满足a^((p-1)/pi)%p!=1
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll quickpower(ll a,ll b,ll m)
{
ll c=1;
while(b)
{
if(b%2) c=(c*a)%m;
b/=2;
a=(a*a)%m;
}
return c;
}
bool solve(ll a,ll p)
{
int n=p-1;
for(ll i=2;i*i<=n;i++)
if(n%i==0)
{
if(quickpower(a,(p-1)/i,p)==1)
return false;
while(n%i==0)
n/=i;
}
if(n>1)
if(quickpower(a,(p-1)/n,p)==1)
return false;
return true;
}
int main()
{
ios::sync_with_stdio(false);
ll p;
cin>>p;
for(ll a=2;a<=p;a++)
if(solve(a,p))
{
cout<<a;
break;
}
return 0;
}