void exgcd(ll a, ll b, ll &x, ll &y, ll &g) {
if(b == 0) {
g = a;
x = 1;
y = 0;
return ;
}
ll x1, y1;
exgcd(b, a % b, x1, y1, g);
x = y1;
y = x1 - (a / b) * y1;
}
long long mult(long long a, long long b, long long mod) {
return (a * b - (long long)(a / (long double) mod * b + 1e-3) * mod + mod) % mod;
}
ll m[maxn], r[maxn];// m 模数 r 余数
ll excrt(int n) {
ll r1 = r[1], m1 = m[1];
ll x, y, g;
for(int i = 2; i <= n; i++) {
ll r2 = r[i], m2 = m[i];
exgcd(m1, m2, x, y, g);
if((r2 - r1) % g)
return -1;
x = mult(x, (r2 - r1) / g, m2 / g);
//x = (r2 - r1) / g * x;
//x = (x % (m2 / g) + (m2 / g)) % (m2 / g);
r1 = r1 + m1 * x;
m1 = m1 / g * m2;
r1 = (r1 + m1) % m1;
}
return r1;
}