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;
}
posted @ 2020-07-29 16:08  GK0328  阅读(77)  评论(0编辑  收藏  举报