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