模板:
#include<iostream>
using namespace std;
long long kpow(int a,int b)
{
long long sum=1;
while(b>0)
{
if(b%2&1)
{
sum=sum*a;
}
b=b>>=1;
a=a*a;
}
return sum;
}
int Primitive_Root(int p)
{
int f=0;
for(int g=2;1;g++) //枚举g
{
if(kpow(g,p-1)%p!=1)
{
continue;
}
f=1;
for(int i=1;i<p-1;i++)//枚举g的次方数
{
if(kpow(g,i)%p==1)
{
f=0;
break;
}
}
if(f) return g;
}
}
int main()
{
int p;
cin>>p;
cout<<Primitive_Root(p)<<endl;
return 0;
}
优化模板:
#include<iostream>
#include<cmath>
using namespace std;
long long kpow(int a,int b)
{
long long sum=1;
while(b>0)
{
if(b%2&1)
{
sum=sum*a;
}
b=b>>=1;
a=a*a;
}
return sum;
}
int Primitive_Root(int p)
{
int f;
int per[1000],ans=1;
per[0]=1;
for(int i=2;i<=sqrt(p-1);i++)
{
if((p-1)%i==0)
{
per[ans]=i;
ans++;
per[ans]=(p-1)/i;
ans++;
}
}
for(int g=2;1;g++)
{
f=1;
for(int i=0;i<ans;i++)
{
if(kpow(g,per[i])%p==1)
{
f=0;
break;
}
}
if(f) return g;
}
}
int main()
{
int p;
cin>>p;
cout<<Primitive_Root(p)<<endl;
return 0;
}