中国剩余定理
中国剩余定理
概念
求解关于 \(x\) 的一元线性同余方程组:
\[\begin{cases} x \equiv a_1 \pmod{m_1} \\ x\equiv a_2 \pmod{m_2} \\ \dots \\ x \equiv a_n \pmod{m_n}\end{cases}
\]
其中 \(m_1,m_2,m_3 \dots m_n\) 两两互质。
解为 \(x=\sum\limits_{i=1}^na_i\frac{M}{m_i}t_i\),其中 \(M=\prod\limits^n_{i=1}m_i,\frac{M}{m_i}t_i\equiv 1 \pmod{m_i}\),即 \(t_i\) 为 \(\frac{M}{m_i}\) 在模 \(m_i\) 意义下的逆元。
证明
由 \(m_i \mid M\),得:
\[\large\forall\ k \not = i,\ a_k\frac{M}{m_k}t_k\equiv0 \pmod{m_i}
\]
由 \(\frac{M}{m_i}t_i\equiv1({\rm mod}\ m_i)\),得:
\[\large a_i\frac{M}{m_i}t_i \equiv a_i \pmod{m_i}
\]
所以得证 \(x=\sum\limits_{i=1}^na_i\frac{M}{m_i}t_i\)。
通解为 \(x+k \times M\left(k \in Z \right)\)。注意计算 \(\frac{M}{m_i}t_i\) 时,不要对 \(m_i\) 取模。
ll crt()
{
ll ans=0,M=1;
for(int i=1;i<=n;++i) M*=m[i];
for(int i=1;i<=n;++i)
{
exgcd(M/m[i],m[i]);
x=(x%m[i]+m[i])%m[i];
ans=(ans+a[i]*M/m[i]*x)%M;
}
return ans;
}
扩展中国剩余定理
概念
求解关于 \(x\) 的一元线性同余方程组:
\[\begin{cases} x \equiv a_1 \pmod{m_1} \\ x\equiv a_2 \pmod{m_2} \\ \dots \\ x \equiv a_n \pmod{m_n}\end{cases}
\]
其中 \(m_1,m_2,m_3 \dots m_n\) 不保证两两互质。
因为不保证两两互质,所以 \(\frac{M}{m_i}\) 在模 \(m_i\) 意义下不一定存在逆元,不能直接做。
考虑为两个方程的情况:
\[\begin{cases} x \equiv a_1 \pmod{m_1} \\ x\equiv a_2 \pmod{m_2} \\\end{cases}
\]
写成不定方程的形式,得:
\[\large x=a_1+m_1t_1=a_2+m_2t_2
\]
再进行转化,得:
\[\large m_1t_1-m_2t_2=a_2-a_1
\]
由裴蜀定理得,当 \(\gcd(m_1,m_2) \not \mid a_2-a_1\) 时,方程无解。有解时可通过 \(exgcd\) 算出一组可行解,得原方程组的解为 \(x \equiv m_1t_1+a_1 \pmod{ \operatorname{lcm}(m_1,m_2) }\)。
多个方程时就两两合并即可。
ll excrt()
{
ll ans=a[1],M=m[1];
for(int i=2;i<=n;++i)
{
ll g=exgcd(M,m[i]),tmp=((a[i]-ans)%m[i]+m[i])%m[i];
if(tmp%g!=0) return -1;
ans+=mul(x,tmp/g,m[i])*M,M*=m[i]/g,ans=(ans%M+M)%M;
}
return ans;
}