Skip to Content
Team NoteAlgorithmCRT

CRT

array<ll, 3> gcdx(ll A, ll B) { ll x1 = 1, x2 = 0, y1 = 0, y2 = 1, r1 = A, r2 = B; while (r2) { ll q = r1 / r2 - ((r1 ^ r2) < 0 && r1 % r2 != 0); tie(x1, x2) = mp(x2, x1 - x2 * q); tie(y1, y2) = mp(y2, y1 - y2 * q); tie(r1, r2) = mp(r2, r1 - r2 * q); } return {x1, y1, r1}; } ll crt(const vl &a, const vl &m) { ll a1 = a[0], m1 = m[0]; for (int i = 1; i < sz(m); ++i) { ll a2 = a[i], m2 = m[i]; auto[x, _, g] = gcdx(m1, m2); if ((a2 - a1) % g) return -1; ll k1 = x * (a2 - a1) / g; a1 = a1 + m1 * k1; m1 = lcm(m1, m2); a1 = md(m1, a1); } return a1; }
Last updated on