應奇怪的數競朋友的要求幫忙而複習了下如何求奇素數的原根,以及bsgs求指標。
其實超級簡潔的思路。
求原根就是暴力枚舉檢驗,bsgs就是使用了哈希表的暴力枚舉檢驗…
這裏就只貼兩個函數了。函數
map<int,int> mp; int bsgs(int a){ int now=1,tmp=ksm(G,m); mp.clear(); rep(i,0,m){ if(mp.count(now))mp[now]=min(mp[now],i); else mp[now]=i; now=1ll*now*G%mod; } now=a; tmp=1ll*ksm(tmp,mod-2)%mod; rep(i,0,m-1){ if(mp.count(now))return (mp[now]+i*m)%(mod-1); now=now*tmp%mod; } return 0; } int get_g(){ int x=mod-1;tot=0; rep(i,1,cnt){ if(x%p[i])continue; if(p[i]>x)break; while(x%p[i]==0)x/=p[i]; q[++tot]=p[i]; } rep(i,2,n){ bool flag=1; rep(j,1,tot){ if(ksm(i,(mod-1)/q[j])==1){flag=0;break;} } if(flag)return i; } return 0; }