扩展crt
题解:
很久之前写过一篇。。但好像写的不太正常
就重新写一篇
对于质数有一种朴素的crt合并
但其实那个没啥用。。那个能做的扩展crt都能做
并且那个好像不能动态加方程组
所以就会扩展crt就行了
扩展crt的原理在于不断合并两个同余方程,于是我们把问题变成如何合并两个同余方程
$$x \equiv b1 \ \ \ \ \ \ mod \ ( \ a1 \ )$$
$$x \equiv b2 \ \ \ \ \ \ mod \ ( \ a2 \ )$$
把上面两个方程写成一般方程
$$x=k1*a1+b1$$
$$x=k2*a2+b2$$
联立得到
$$k1*a1-k2*a2=b2-b1$$
设$g=gcd(k1,k2)$
由欧几里得算法可知方程有解当且仅当$g|(b2-b1)$
两边同除g
$$k1*\frac{a1}{g}-k2*\frac{a2}{g}=\frac{b2-b1}{g}$$
然后我们把它写成关于$\frac{a2}{g}$的同余方程
$$k1*\frac{a1}{g}-k2*\frac{a2}{g} \equiv \frac{b2-b1}{g} \ \ \ \ \ \ mod \ ( \ \frac{a2}{g} \ ) $$
由于$\frac{a1}{g}$与$\frac{a2}{g}$互素,我们可以求出$\frac{a1}{g}$在对$\frac{a2}{g}$取模意义下的逆元inv
然后再把方程写成一般形式
$$k1=inv*\frac{b2-b1}{g}+k*\frac{a2}{g}$$
把它带回第一个式子,得到
$$x=(inv*\frac{b2-b1}{g}+k*\frac{a2}{g})*a1+b1$$
展开一下
$$x=inv*a1*\frac{b2-b1}{g}+b1+k*\frac{a2}{g}*a1$$
于是再把它转化成对$\frac{a2}{g}*a1$取模的同余方程就可以了
$$x \equiv a1*inv*\frac{b2-b1}{g}+b1 \ \ \ \ \ \ mod \ ( \ \frac{a2}{g}*a1 \ ) $$
另外写代码的时候$inv*\frac{b2-b1}{g}$这一项可以先对$\frac{a2}{g}$取模防止爆大小,正确性比较显然