On this page
article
Teorema Chines do Resto
Sobre
Combina equacoes modulares lineares: x = a (mod m)
O m final eh o lcm dos m’s, e a resposta eh unica mod o lcm
Os m nao precisam ser coprimos
Se nao tiver solucao, o ‘a’ vai ser -1
Link original: chinese.cpp
Código
template<typename T> tuple<T, T, T> ext_gcd(T a, T b) {
if (!a) return {b, 0, 1};
auto [g, x, y] = ext_gcd(b%a, a);
return {g, y - b/a*x, x};
}
template<typename T = ll> struct crt {
T a, m;
crt() : a(0), m(1) {}
crt(T a_, T m_) : a(a_), m(m_) {}
crt operator * (crt C) {
auto [g, x, y] = ext_gcd(m, C.m);
if ((a - C.a) % g) a = -1;
if (a == -1 or C.a == -1) return crt(-1, 0);
T lcm = m/g*C.m;
T ans = a + (x*(C.a-a)/g % (C.m/g))*m;
return crt((ans % lcm + lcm) % lcm, lcm);
}
};