[算法学习] 中国剩余定理
中国剩余定理
对于\(n\)对\(x \bmod a_i = b_i\)方程,我们常用\(CRT\)或者\(ExCRT\)进行求解。
当\(a_i\)两两互质的时候,两种方法均可使用,但如果\(a_i\)不能两两互质,那么只能用\(ExCRT\).
CRT
我们另\(mul = \prod_{i=1}^n a_i\),\(m_i=\frac{mul}{a_i}\)
那么我们可以轻松的知道\(m_i\)只有在\(\bmod a_i\)的情况下不为0
我们尝试构造,另\(m_i \times s_i = 1 (\bmod a_i)\)
然后根据上面的结论,答案就是\(\sum_{i = 1}^n {m_i s_i b_i}\)
ExCRT
我们可以先考虑两个方程的解的情况。
\(x \bmod a_1 = b_1\)
\(x \bmod a_2 = b_2\)
我们把方程转化一下
\(x - a_1 y_1 = b_1\)
\(x - a_2 y_2 = b_2\)
两个柿子相减
我们可以得到
\(a_1 * y_1 - a_2 * y_2 = b_2 - b_1\)
同样我们可以通过exgcd然后取模得到最小的y_1,从而得到\(x = b_1 +a_1y_1\)
然后两个方程合并成了\(x \bmod (lcm(a_1, a_2)) = b_1 +a_1y_1\)
然后不断合并就行了