1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| i64 exgcd(i64 a, i64 b, i64 &x, i64 &y) { if (b == 0) { x = 1; y = 0; return a; } i64 g = exgcd(b, a % b, y, x); y -= a / b * x; return g; }
std::pair<i64, i64> sol(i64 a, i64 b, i64 m) { assert(m > 0); b *= -1; i64 x, y; i64 g = exgcd(a, m, x, y); if (g < 0) { g *= -1; x *= -1; y *= -1; } if (b % g != 0) { return {-1, -1}; } x = x * (b / g) % (m / g); if (x < 0) { x += m / g; } return {x, m / g}; }
std::array<i64, 3> exgcd(i64 a, i64 b) { if (!b) { return {a, 1, 0}; } auto [g, x, y] = exgcd(b, a % b); return {g, y, x - a / b * y}; }
|