题解:
很久之前写过一篇。。但好像写的不太正常
就重新写一篇
对于质数有一种朴素的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}$取模防止爆大小,正确性比较显然