线性同余方程
线性同余方程是形如(axequiv b(mod m))的方程。
求解方法:
如果(gcd(a,m)==1),则(a^{-1})存在,此时可以直接通过逆元求解,(x=a^{-1}*b)
但是如果(gcd(a,m)
eq 1),也就是逆元不存在,方程依然可能有解,设(d=gcd(a,m)),方程可以变为:
(frac{a}{d}x=frac{b}{d}(mod frac{m}{d}))
所以只有当(b)无法整除(d)时,原方程无解。
如果原方程有解,由于(gcd(frac{a}{d},frac{m}{d})==1),可以通过逆元求解:
(x=(frac{a}{d})^{-1}*frac{b}{d}(mod frac{m}{d}))
所以
(x=(frac{a}{d})^{-1}*frac{b}{d}+(frac{m}{d})*k(mod m)(0leq k<gcd(a,m)))
线性同余方程组
线性同余方程组是由多个线性同余方程联立得到的方程组,也就是(axequiv b_i(mod m_i)(1leq ileq n))
如果方程组有解,那么一定有无穷多解,可以表示成(xequiv b(mod m))的形式,所以转化为求解(b)和(m)。
如果可以求解方程组(left{egin{matrix}xequiv b_1(mod m_1)\axequiv b_2(mod m_2)end{matrix}
ight.),那么就可以逐个求解所有线性同余方程。
将第一个方程转化为(x=b_1+m_1*t),代入第二个方程,得到(a(b_1+m_1*t)equiv b_2(mod m_2))
也就是(a*m_1*tequiv b_2-a_1*t(mod m_2))
这是一个线性同余方程,可以使用(exgcd)求解。当(gcd(a*m_1,m_2)
mid (b_2-a_1*t))时,原方程组无解。
开始时将解设为可以表示所有整数的形式,也就是(xequiv 0(mod 1))
函数返回一个((b,m))整数对。
PII linear_congruence(vector<int> A,vector<int> B,vector<int> M){
int x=0,m=1;
l=A.size();
for(int i=0;i<l;i++){
int a=A[i]*m,b=B[i]-A[i]*x,d=gcd(max(a,M[i]),min(a,M[i]));
if(b%d) return {0,-1};
a/=d;
b/=d;
M[i]/=d;
LL t=b*inv(a,M[i])%M[i];
x=x+m*t;
m*=M[i];
}
return {(x+m)%m,m};
}