扩展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}$取模防止爆大小,正确性比较显然

posted @ 2018-12-12 09:42  尹吴潇  阅读(193)  评论(0编辑  收藏  举报