51Nod 1135 - 原根(数论)
【题目描述】
【思路】
一个素数 的原根有 个,求解方法是对 进行唯一分解,设 ,则对于一个数 , 是模 原根的充要条件是
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int mod;
int fac[100005],cnt;
ll pw(ll x,ll n){
ll ans=1;
while(n){
if(n&1) ans=ans*x%mod;
x=x*x%mod;
n>>=1;
}
return ans;
}
int main(){
scanf("%d",&mod);
int x=mod-1,m=sqrt(x)+0.5;
for(int i=2;i<=m;++i){
if(x%i==0) fac[cnt++]=i;
while(x%i==0) x/=i;
}
if(x>1) fac[cnt++]=x;
for(int g=2;g<mod;++g){
bool ok=true;
for(int j=0;j<cnt;++j){
if(pw(g,(mod-1)/fac[j])==1){
ok=false;
break;
}
}
if(ok){
printf("%d\n",g);
break;
}
}
return 0;
}