inlineintBSGS(int a, int b, int p){
a %= p, b %= p;
if (b == 1 || a == b) return b != 1;
map<int, int> mp;
int B = ceil(sqrt(p)), res = inf;
for (int i = B; i; i--) {
mp[ksmi(a, i * B, p)] = i * B;
}
for (int i = 0; i <= B; i++) {
if (mp.find(b * ksmi(a, i, p) % p) != mp.end()) {
res = min(res, mp[b * ksmi(a, i, p) % p] - i);
}
}
if (res == inf) {
return-1;
} else {
return res;
}
}