中国剩余定理给出了以下的一元线性同余方程组:
![](https://i-blog.csdnimg.cn/blog_migrate/daec697ba0f2284cf6ce6cafc37fbda5.png)
中国可求解该方程:假设整数m1,m2, ... ,mn两两互质,则对任意的整数:a1,a2, ... ,an,方程组 (S)有解。
具体解释过程可看:数论四大定理
代码:
void ex_gcd(ll a, ll b, ll &x, ll &y, ll &d){
if (!b) {d = a, x = 1, y = 0;}
else{
ex_gcd(b, a % b, y, x, d);
y -= x * (a / b);
}
}
ll inv(ll t, ll p){//如果不存在,返回-1
ll d, x, y;
ex_gcd(t, p, x, y, d);
return d == 1 ? (x % p + p) % p : -1;
}
//n个方程:x=a[i](mod m[i]) (0<=i<n)
ll china(int n, ll *a, ll *m){
ll M = 1, ret = 0;
for(int i = 0; i < n; i ++) M *= m[i];
for(int i = 0; i < n; i ++){
ll w = M / m[i];
ret = (ret + w * inv(w, m[i]) * a[i]) % M; //这里用ex_gcd求逆元,因为他们是两两互质,而m[i]不一定是质数
}
return (ret + M) % M;
}