浅谈CRT&exCRT
CRT
求解同余方程组:
\[\begin{cases}
x \equiv a_1 \pmod{m_1}\
x \equiv a_2 \pmod{m_2}\
\quad\vdots\
x \equiv a_n \pmod{m_n}
\end{cases}
\]
条件:\(m_1,m_2,\dots,m_n\) 两两互质
设 \(M=\prod m_i\),\(M_i = \dfrac{M}{m_i}\)
求 \(t_i\) 满足 \(M_i\cdot t_i \equiv 1 \pmod{m_i}\)(\(t_i\) 是 \(M_i\) 在模 \(m_i\) 的逆元,exgcd求)
通解:
\[x = \sum_{i=1}^n a_i M_i t_i \pmod{M}
\]
最小正整数解就是结果,通解 \(x + kM,\ k\in\mathbb Z\)
exCRT
合并两个同余式:
\[\begin{cases}
x\equiv a_1 \pmod{m_1}\
x\equiv a_2 \pmod{m_2}
\end{cases}
\]
写成:
\[x = a_1 + k\cdot m_1
\]
代入第二个式子:
\[a_1 + k m_1 \equiv a_2 \pmod{m_2}
\]
\[m_1\cdot k \equiv a_2-a_1 \pmod{m_2}
\]
这是关于 \(k\) 的一元一次同余方程,用 exgcd 求解。
令 \(d=\gcd(m_1,m_2),\ c=a_2-a_1\)
-
若 \(d\nmid c\):方程组无解
-
若 \(d\mid c\):求出 \(k\) 的最小正特解 \(k_0\)
合并后的新同余方程:
\[x \equiv a_1 + k_0 m_1 \pmod{\text{lcm}(m_1,m_2)}
\]
其中 \(\text{lcm}(m_1,m_2)=\dfrac{m_1m_2}{d}\)
不断两两合并,最终得到整个方程组的解。
模版
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=1;y=0;return a;}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll exCRT(vector<ll>&a,vector<ll>&m){
ll res=a[0],M=m[0];
for(int i=1;i<a.size();i++){
ll c=a[i]-res,x,y;
ll d=exgcd(M,m[i],x,y);
if(c%d) return -1;
ll tmp=m[i]/d;
ll k=( (__int128)x*(c/d)%tmp + tmp )%tmp;
res += (__int128)M * k;
M = (__int128)M / d * m[i];
res = (res%M+M)%M;
}
return res;
}

CRT&exCRT
浙公网安备 33010602011771号