中国剩余定理
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 \not= k\)
对于第一部分, 有 \(One \equiv a_{k}\ (Mod\ m_{k})\)
对于第二部分, 因为 \(Two = \sum_{i = 1}^{n}a_{i}M_{i}t_{i},\ i \not= 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;
}