if (b == 0) { if (n == 0) output(1); failed(); } if (n == 1) { output(0); } if (b == 1) { failed(); }
i128 m = sqrt(p), z = n; for (i128 i = 0; i < m; ++i) { mp[z] = i; // 存储的实际上是模数所对应的最大 r(从小到大枚举,挨个覆盖) z = z * b % p; } z = binpow(b, m); for (i128 i = 1, pian = z; i <= p / m + 10; ++i) { auto it = mp.find(z); if (it != mp.end()) { output(m * i - it->second); } z = z * pian % p; } failed();