BSGS模板
作者:
DoIdo
,
2020-02-21 23:04:33
,
所有人可见
,
阅读 697
void init(int a, int b, int p, int m) {
for (int i = 0; i < m; i++) {
ll temp = quick_pow(a, i, p);
mp[(temp * b) % p] = i;
}
}
int BSGS(int a, int b, int p) {
mp.clear(), b %= p;
int m = (int)sqrt(p) + 1; //害怕精度不够
init(a, b, p, m);
a = quick_pow(a, m, p);
if (a == 0) return b ? -1 : 1;
for (int i = 0; i <= m; i++)
{
int temp = quick_pow(a, i, p);
int j;
if (mp.count(temp)) {
j = mp[temp];
}
else j = -1;
if (j >= 0 && i * m - j >= 0) return i * m - j;
}
return -1;
}