typedef pair<bint,bint> E;
E exgcd(bint a, bint b) {
if (!b) {
return {1, 0};
} else {
auto [x, y] = exgcd(b, a % b);
return {y, x - a / b * y};
}
}
E mge(const E &a, const E &b) {
bint g = gcd(a.x, b.x);
bint c = b.y - a.y;
assert(c % g == 0);
c /= g;
bint m = a.x / g, n = b.x / g;
auto [p, q] = exgcd(m, n);
p *= c;
p = (p % n + n) % n;
bint mod = lcm(a.x, b.x);
E ret = {mod, (a.x * p + a.y)};
assert(ret.y % a.x == a.y);
// RE here !
return ret;
}
其中 mge
是对两个同余方程的合并,中间有一个 assert
用来判断合并是否正确,这个 assert
导致 RE on #8 #9,但是去掉之后就可以 AC