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

  • 相关阅读:
    jQuery 核心
    Js实现内容向上无缝循环滚动
    浅析CSS postion属性值用法
    JS原生Ajax请求
    详解SQL集合运算
    Windows上开启IIS
    poj 4618 暴力
    hdu 4614 线段树
    poj 3468 线段树
    hdu 1698 线段树成段更新
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/10106667.html
Copyright © 2020-2023  润新知