EXCRT戳这里
先导知识:扩展欧几里得, 逆元。
引理1:若 (SUM = sum_{i = 1}^{n}a_{i}) 且其中只有一个数 (a_{k}) 不能被(P)整除, 那么(SUM) 不能被 (P) 整除, 且余数为 (a_{k} mod P)
引理2:在一个不能整除的式子中,若被除数扩大 (n) 倍,则余数在不超过除数的情况下同时扩大 (n) 倍
设 (S = prod_{i = 1}^{n}m_{i}), (M_{i} = S / m_{i}), 因为模数两两互质,所以 (M_{i}) 不能被 (m_{i}) 整除(互质)
设 (t_{i}) 满足 (M_{i}t_{i} equiv 1 (Mod m_{i})), 即为 (M_{i}) 在 (Mod m_{i}) 意义下的逆元
如何保证其有解呢?这个同余方程有解, 当且仅当 (1 | gcd(m_{i}, M_{i})); 然而上面就已经得到这两数互质, 即 (gcd(m_{i}, M_{i}) = 1), 中国剩余定理在模数互质的情况下总有解
现在我们得到了 (M_{i}t_{i} equiv 1(Mod m_{i})),
依据引理2, 两边同时乘以 (a_{i}) , 有: (a_{i}M_{i}t_{i} equiv a_{i} (Mod m_{i}))
现在令 (Ans = sum_{i = 1}^{n}a_{i}M_{i}t_{i}), 这个数满足两个重要条件:
对于 (k) 讨论:
把 (Ans) 分为两部分, 第一部分为 (One = a_{k}M_{k}t_{k}), 第二部分为 (Two = Ans - a_{k}M_{k}t_{k} = sum_{i = 1}^{n}a_{i}M_{i}t_{i}, i ot= k)
对于第一部分, 有 (One equiv a_{k} (Mod m_{k}))
对于第二部分, 因为 (Two = sum_{i = 1}^{n}a_{i}M_{i}t_{i}, i ot= k) 中每一项加数都含有 (m_{k}) 这一因子,故 (Two equiv 0 (Mod m_{k}))
我们的 (Ans = One + Two) 由引理1可得, (Ans) 满足 (Ans equiv a_{k} (Mod m_{k}))
因为讨论的 (k) 具有任意性, 故中国剩余定理的通项解为 $$sum_{i = 1}^{n}a_{i}M_{i}t_{i}$$
证毕。
其中 (t_{i}) 可以有扩展欧几里得算法解得
Code
LL exgcd(LL a,LL b,LL &x,LL &y){
if(!b){x = 1,y = 0;return a;}
LL d = exgcd(b,a % b,x,y);
LL temp = x;x = y,y = temp - y * (a / b);
return d;
}
LL China(){
LL ans = 0,M = 1;
for(int i = 1;i <= num;i++)M *= I[i].m;
for(int i = 1;i <= num;i++){
LL m = M / I[i].m;
LL d = exgcd(m,I[i].m,x,y);
ans = (ans + I[i].a * m * x) % M;
}
if(ans < 0)ans += M;
return ans;
}