zoukankan      html  css  js  c++  java
  • 扩展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}$取模防止爆大小,正确性比较显然

  • 相关阅读:
    十大Intellij IDEA快捷键
    IDEA 在同一目录创建多个项目
    IDEA2017 使用(二)
    idea使用(一)
    js == 与 === 的区别[转]
    Spring Boot(一)
    微服务实战(一):微服务架构的优势与不足
    phpcms:三、头部包含
    phpcms:二、头部尾部包含
    phpcms:一、安装及新建模板
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/10106667.html
Copyright © 2011-2022 走看看