1. 程式人生 > >51nod1135 原根

51nod1135 原根

分享 scanf name tdi mod isp %d nbsp 暴力

原根判定:$m>2$,$\varphi (m)$的不同素數是$q_1,q_2,……,q_s$,$(g,m)=1$,則$g$是$m$的一個原根的充要條件是$g^{\frac{\varphi(m)}{q_i}} \not\equiv 1 (mod m)$。

原根一般很小可以暴力得。

技術分享圖片
 1 //#include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 //#include<math.h>
 6 //#include<time.h>
7 //#include<complex> 8 #include<algorithm> 9 using namespace std; 10 11 int p; 12 int s[44],len=0; 13 14 int powmod(int a,int b) 15 { 16 int ans=1; 17 while (b) 18 { 19 if (b&1) ans=1ll*ans*a%p; 20 a=1ll*a*a%p; 21 b>>=1; 22 } 23 return
ans; 24 } 25 26 int main() 27 { 28 scanf("%d",&p); 29 int tmp=p-1; 30 for (int i=2;1ll*i*i<=tmp;i++) if (tmp%i==0) 31 { 32 s[++len]=i; 33 while (tmp%i==0) tmp/=i; 34 } 35 if (tmp>1) s[++len]=tmp; 36 for (int i=2;i<=p-1;i++) 37 { 38 bool
flag=1; 39 for (int j=1;j<=len;j++) if (powmod(i,(p-1)/s[j])==1) {flag=0; break;} 40 if (flag) {printf("%d\n",i); break;} 41 } 42 return 0; 43 }
View Code

51nod1135 原根