中国剩余定理
结论
方程组x ≡ c i ( m o d m i ) ( i = 1 , 2 , 3 , … , n ) x \equiv c_i \pmod{m_i} \quad (i=1, 2, 3, \ldots, n) x ≡ c i ( m o d m i ) ( i = 1 , 2 , 3 , … , n ) .其中m i m_i m i [两两互质 ]{.underline}。
中国剩余定理是说,这样的线性同余方程组的通解是x = x 0 + M t ,  t ∈ Z x=x_0+Mt, \, t \in Z x = x 0 + M t , t ∈ Z .其中M = ∏ i = 1 n m i M=\prod\limits_{i=1}^{n}m_i M = i = 1 ∏ n m i ,即所有模数的乘积;x 0 = ( ∑ i = 1 n c i M i M i m i − 1 )  m o d  M x_0={
\left(
\sum\limits_{i=1}^{n}
c_i M_i {M_i}_{m_i}^{-1}
\right) \bmod M
} x 0 = ( i = 1 ∑ n c i M i M i m i − 1 ) m o d M .其中M i = M m i M_i=\frac{M}{m_i} M i = m i M ,即M i M_i M i 是除掉第i i i 个模数m i m_i m i 之外所有模数的积;M i m i − 1 {M_i}_{m_i}^{-1} M i m i − 1 是M i M_i M i 关于模数m i m_i m i 的逆元。显然模M意义下,解有且只有一个,即x 0 x_0 x 0 。
证明
只需要证明下面三个子命题,就可以得到通解必须是上面的所述。
证明x 0 x_0 x 0 是一个特解。
所有解都可以表示成x 0 + M t x_0+Mt x 0 + M t
子命题1的证明
对于第i i i 个方程x ≡ c i ( m o d m i ) x \equiv c_i \pmod{m_i} x ≡ c i ( m o d m i ) ,求和式x 0 = ( ∑ j = 1 n c j M j M j m j − 1 )  m o d  M x_0 = \left(
\sum\limits_{j=1}^{n}
c_j M_j {M_j}_{m_j}^{-1} \right) \bmod M x 0 = ( j = 1 ∑ n c j M j M j m j − 1 ) m o d M (为了避免歧义,把求和式中的枚举下标换成j了)。
当j = i j=i j = i ,则c j M j M j m j − 1  m o d  m i = c i  m o d  m i c_j M_j {M_j}_{m_j}^{-1} \bmod m_i = c_i \bmod m_i c j M j M j m j − 1 m o d m i = c i m o d m i .因为M j m j − 1 {M_j}_{m_j}^{-1} M j m j − 1 就是M j M_j M j 在模m j m_j m j 意义下的逆元,当你计算他们的乘积模m j m_j m j 时,自然等于1了。
当j ≠ i j \neq i j ̸ = i ,而M j M_j M j 是除了m j m_j m j 之外所有模数的乘积,自然含有因数m i m_i m i 了,因此,c j M j M j m j − 1  m o d  m i = 0 c_j M_j {M_j}_{m_j}^{-1} \bmod m_i = 0 c j M j M j m j − 1 m o d m i = 0
所以这个求和式在模m i m_i m i 意义下只有第i i i 项有贡献,且贡献恰好是c i c_i c i .因此,满足第i i i 个方程,由于i i i 是任意的,所以x 0 x_0 x 0 满足所有方程,是方程组的一个特解。
子命题2的证明
假设有一个解x 1 x_1 x 1
则显然有x 1 − x 0 ≡ 0 ( m o d m i ) ( i = 1 , 2 , 3 , … , n ) x_1-x_0 \equiv 0 \pmod{m_i} \quad (i=1, 2, 3, \ldots, n) x 1 − x 0 ≡ 0 ( m o d m i ) ( i = 1 , 2 , 3 , … , n ) .
因此x 1 − x 0 = l c m ( m 1 , m 2 , m 3 , … , m n ) × t = M t ( t ∈ Z ) x_1-x_0=lcm(m_1,m_2,m_3,\ldots,m_n) \times t=Mt \quad (t \in Z) x 1 − x 0 = l c m ( m 1 , m 2 , m 3 , … , m n ) × t = M t ( t ∈ Z ) .
于是任意解都可以表示成x 0 + M t x_0+Mt x 0 + M t 的形式。
Code
bool chinese_remainder_theory ( int n, ll c[ ] , ll m[ ] , ll & x, ll & k) {
ll & M = k;
ll Mi, inv_Mi;
__int128 t;
M = 1 ; x = 0 ;
for ( int i= 0 ; i < n; ++ i) M * = m[ i] ;
for ( int i = 0 ; i < n; ++ i) {
Mi = M/ m[ i] ;
multiplicative_inverse ( Mi, m[ i] , inv_Mi) ;
t = c[ i] % M;
t = t* Mi% M;
t = t* inv_Mi% M;
x = ( x+ ( ll) t) % M;
}
return true ;
}