之前没听说过,原来就是个根号分治。
求这样的方程:
。
其中已知, 是质数。
做法
考虑对于所有的 把 插入一个Hash表
int m = ceil(sqrt(p)); int val = n % p; for (int j = 0; j <= m; j++) { mp[val] = j; val *= b; val %= p; }枚举 ,计算出 ,在Hash表中查找是否存在对应的 并更新答案,这样就得出了 ,又因为 已知,所以可以求出方程的解 .
int bm = qpow(b, m); val = bm; for (int i = 1; i <= m; i++) { if (mp.count(val)) { int ans = i * m - mp[val]; if (ans >= 0) { cout << ans << endl; return; } } val *= bm; val %= p; }