原根

来源:互联网 发布:淘宝店群模式靠谱吗 编辑:程序博客网 时间:2024/06/09 22:54
1135 . 原根
时间限制:1 秒 空间限制:65536 KB 分值: 0
设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
给出1个质数P,找出P最小的原根。
Input
输入1个质数P(3 <= P <= 10^9)
Output
输出P最小的原根。
直接应用上一篇博文的结论即可。
#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int maxn = 100000+10;typedef long long LL;bool prime[maxn];int prim[maxn],k;void make_prime(){    memset(prime,0,sizeof(prime));    k=0;    for(int i=2;i<maxn;i++)        if(!prime[i]){        prim[k++]=i;        for(int j=0;j<k&&prim[j]<maxn/i;j++)        {            prime[i*prim[j]]=1;            if(i%prim[j]==0) break;        }    }}int fac[50],num;void divide(LL n){    num=0;    for(int i=0;prim[i]*prim[i]<=n;i++)        if(n%prim[i]==0){            fac[num++]=prim[i];            while(n%prim[i]==0) n/=prim[i];        }    if(n>1) fac[num++]=n;}LL pow_mod(LL a,LL b,LL mod){    LL r=1;    while(b)    {        if(b&1)            r=r*a%mod;        a=a*a%mod;        b>>=1;    }    return r;}int main(){    LL p;    make_prime();    while(cin>>p)    {        divide(p-1);        for(int i=2;i<p;i++)        {            bool flag=true;            for(int j=0;j<num;j++)            {                int x=(p-1)/fac[j];                if(pow_mod(i,x,p)==1){                    flag=false;                    break;                }            }            if(flag){                printf("%d\n",i);                break;            }        }    }    return 0;}


原创粉丝点击