unordered_map<int, int> mp; intBsgs(int a, int b, int p){ if (1 % p == b % p) return0; int k = sqrt(p) + 1; for (int i = 0, val = b % p; i < k; ++i, val = val * a % p) { mp[val] = i; } for (int i = 1, ak = power(a, k, p), val = ak; i <= k; ++i, val = val * ak % p) { if (mp.count(val)) return k * i - mp[val]; } return-1; }
intexgcd(int a, int b, int &x, int &y){ /* ... */ } inlineintinv(int a, int p){ /* ... */ }
unordered_map<int, int> mp; inlineintBsgs(int a, int b, int p){ /* ... */ } intexBsgs(int a, int b, int p){ b = (b % p + p) % p; int d = gcd(a, p); if (d == 1) { returnBsgs(a, b, p); } else { if (1 % p == b % p) return0; if (b % d) return NINF; elsereturnexBsgs(a, b / d * inv(a / d, p / d), p / d) + 1; } }