应奇怪的数竞朋友的要求帮忙而复习了下如何求奇素数的原根,以及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; }