要解的是一个很容易的东西
\[ \begin{aligned} x\equiv a_1(mod\ m_1)\\ x\equiv a_2(mod\ m_2)\\ ...\\ x\equiv a_n(mod\ m_n) \end{aligned} \]
保证\(m_1,m_2...m_n\)之间两两互质,求最小的\(x\)。ui
设\(M=\prod m_i\)。spa
首先咱们肯定一点,咱们求出了任意一个知足条件的\(x\)以后,只须要对其模\(M\)就是最终的答案。class
由于\(M\)是全部数的\(lcm\)。gc
考虑一下,对于每个\(a_i\),若是咱们可以求出一个数\(x_i\)方法
知足它是其余全部\(m\)的乘积,即\(M_i=M/m_i\)的倍数,而且\(x_i\equiv 1(mod\ m_i)\)统计
也就是对于任意一个\(x_i\),知足\(x_i\equiv 0(mod\ m_k),k\ne i\),\(x_i\equiv 1(mode\ m_i)\)di
那么最终的答案就会是\(\sum(a_ix_i)mod\ M\)。display
深思熟虑的考虑如何求出\(x_i\),math
由于\(x_i\)是\(M_i\)的倍数,因此\(x_i=kM_i\equiv 1(mod\ m_i)\)版本
因此\(k\)是\(M_i\)在模\(m_i\)意义下的逆元。因此\(x_i\)就是\(k\)的\(M_i\)倍,注意最终统计入结果的模数是\(M\)。
因此,\(CRT\)的结果就是\(\sum (a_ik_iM_i)mod\ M\)。
要求的东西同上,不保证全部\(m_i\)互质。
咱们确定不能像上面那样堆在一块儿求了。
换个方法,假设咱们只有两个方程。\(x\equiv a_1(mod\ m_1),x\equiv a_2(mod\ m_2)\)
怎么算答案?
显然是要知足:\(x=x_1m_1+a_1=x_2m_2+a_2\),而且\(x\)最小。
显然是\(x_1,x_2\)都要尽量的小。
因此\(x_1m_1+x_2m_2=a_2-a_1\)
那么\(exgcd\)能够求解最小的\(x_1\),而后就能够求得\(x=x_1m_1+a_1\)
这样子就能够同时知足这两个方程了,由于方程有多个,
因此咱们把这两个方程合并,假设当前求出来的解是\(x'\)
那么咱们就新加入一个方程\(x\equiv x'(mod\ lcm(m_1,m_2))\)就行了。