模板:
int bsgs(){
map<int, int> mp;java后端
b %= p;
int t = (int)sqrt(p) + 1;
for (int j = 0; j < t; ++j){
int val = b * qmi(a, j, p) % p;
mp[val] = j;
}
a = qmi(a, t, p);
if(a == 0)
return b == 0 ? 1 : -1;
a = qmi(a, t, p);
for (int i = 0; i <= t; ++i){
int val = qmi(a, i, p);
int j = mp.find(val) == mp.end() ? -1 : mp[val];
if(j >= 0 && i * t - j >= 0)
return i * t - j;
}
return -1;
}