蒟蒻求助!!!玄关

P4195 【模板】扩展 BSGS/exBSGS

@[IOI_ILJYT](/user/902351) [这里](https://www.luogu.com.cn/discuss/684623)挺详细的
by Parrhesiates @ 2024-01-25 13:57:30


@[Parrhesiates](/user/519824) 只不过我没有看懂 `不要用快速幂,是可以递推的` 这个是什么意思。。。
by IOI_ILJYT @ 2024-01-25 14:00:45


@[IOI_ILJYT](/user/902351) 已经有人了,我就不掺和了。
by wangguandingding @ 2024-01-25 14:01:22


@[wangguandingding](/user/1060446) 6
by IOI_ILJYT @ 2024-01-25 14:02:48


```cpp #include <iostream> #include <unordered_map> #include <cmath> std::unordered_map<int, int> m; inline int read() { int x = 0, ch; while (!isdigit(ch = getchar())); while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar(); return x; } inline int exgcd(int a, int b, int &x, int &y) { if (!b) { x = 1, y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= a / b * x; return d; } inline int inv(int x, int p) { int a, b; exgcd(x, p, a, b); return (a % p + p) % p; } inline int gcd(int x, int y) { return !y ? x : gcd(y, x % y); } inline int qmi(int x, int k, int mod) { int s = 1; while (k) { if (k & 1) s = 1ll * s * x % mod; x = 1ll * x * x % mod; k >>= 1; } return s; } inline int exbsgs(int a, int b, int p) { b %= p; m.clear(); if (b == 1 || p == 1) return 0; if (!a) { if (!b) return 0; else return -1; } int d = 1, g = gcd(a, p), cnt = 0; while (g > 1) { if (b % g) return -1; cnt++, p /= g, b /= g; d = 1ll * d * a / g % p; g = gcd(a, p); if (d == p) return cnt; } if (a == 1) return (b == 1) - 1; int prd = 1, sqr = (int)sqrt(p); for (int i = 0; i < sqr; i++) m[int(1ll * b * prd % p)] = i + 1, prd = 1ll * prd * a % p; for (int i = 0; i <= sqr; i++) { int k = i * sqr - m[d] + 1 + cnt; if (m[d] && k > 0) return k; d = 1ll * prd * d % p; } return -1; } int main() { int a, p, b; a = read(), p = read(), b = read(); while (a || p || b) { int res = exbsgs(a, b, p); if (res < 0) puts("No Solution"); else printf("%d\n", res); a = read(), p = read(), b = read(); } return 0; } ```
by IOI_ILJYT @ 2024-01-25 14:04:06


|