https://thesobersobber.github.io/CP-Snippets/crt
/**
* Chinese remainder theorem.
* Find z such that z % x[i] = a[i] for all i.
* */
long long crt(vector<long long> &a, vector<long long> &x) {
long long z = 0;
long long n = 1;
for (int i = 0; i < x.size(); ++i)
n *= x[i];
for (int i = 0; i < a.size(); ++i) {
long long tmp = (a[i] * (n / x[i])) % n;
tmp = (tmp * mod_inv(n / x[i], x[i])) % n;
z = (z + tmp) % n;
}
return (z + n) % n;
}