题目链接:51nod 1135 原根
原根戳这里:数论之原根
Code
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
int primitive_root(int p);
long long g_test(long long g, long long p);
long long q_pow(long long a, long long b, long long c);
int main()
{
ll p;
cin>>p;
cout<<primitive_root(p);
return 0;
}
int a[100005], len;
long long q_pow(long long a, long long b, long long c)
{
long long ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%c;
a=(a*a)%c;
b/=2;
}
return ans;
}
// test if g ^ ((p-1)/a) == 1 (mod p)
long long g_test(long long g, long long p)
{
for(int i=0;i<len;i++)
if(q_pow(g, (p-1)/a[i], p)==1)
return 0;
return 1;
}
int primitive_root(int p)
{
// get the prime factor of p-1
len=0;
int tmp=p-1;
for(int i=2;i*i<=tmp;i++)
{
if(tmp%i==0)
{
a[len++]=i;
while(tmp%i==0)
tmp/=i;
}
}
if(tmp!=1)
a[len++]=tmp;
// find the primitive root
int g=1;
while(g<p)
{
if(g_test((ll)g,(ll)p))
return g;
g++;
}
}
后面找时间接着补。