zoukankan      html  css  js  c++  java
  • 中国剩余定理-CRT

    (好久好久以前就有讲过的)

    可惜我太弱了

    听了两边都没听懂

    而且自己还不研究研究(极度内疚)

    就...

    哭辽qwq

    ----------------------------------------------------------------

    目的:求解同余方程组:

    x≡ a1​(modm1​)

    x≡ a2​(modm2​)

    x≡ a3​(modm3​)

    ...

    x≡ ak​(modmk​)​

    适用范围:m1、m2、…、mk为两两互质的整数

    定理

    1.求所有mi 的lcm:M(累乘)(因为他们都互质啊!!!)

    2. 求​同余方程 (M/mi)*ti≡ 1(mod mi)的最小非负整数解ti

    3.有一个解为x=∑k i=1ai*(M/mi)*ti

    4.通解为x+i*M (i∈z)

    证明:

    (M / mi) % mk = 0 (k != i)

    因此对于任意k != i

    都有 ak * (M / mi) * ti  ≡  0(mod mk)

    (M/mi) * ti ≡ 1(mod mi)

    根据同余方程的性质

    ai * (M / mi) * ti ≡ ai(mod mi)

    令x = ai * (M / mi) * ti(i ∈[1,k],i ∈z)的累加

    即可满足原同余方程组

    通解为x+i∗M(i∈Z)

    最小非负整数解为(x%M+M)%M

    void exgcd(int a,int b,int &x,int &y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return;
        }
        exgcd(b,a%b,x,y);
        int tp=x;
        x=y;
        y=tp-a/b*y;
    }
    int china()
    {
         int ans=0,lcm=1,x,y;
         for(int i=1;i<=k;++i) 
                lcm*=b[i];
         for(int i=1;i<=k;++i)
         {
                int tp=lcm/b[i];
                exgcd(tp,b[i],x,y);
                x=(x%b[i]+b[i])%b[i];
                ans=(ans+tp*x*a[i])%lcm;
         }
         return(ans+lcm)%lcm;
    }
  • 相关阅读:
    C#中的Dictionary的使用
    关于加密和解密的方法
    单链表逆置
    稀疏矩阵存储
    数组内存地址
    堆和栈的区别
    vc++6.0快捷键
    springMvc-02
    SpringMvc-01
    数据库字段设置问题,具体问题具体分析
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10491958.html
Copyright © 2011-2022 走看看