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; }