/* 返回顶部 */

[数论]中国剩余定理

今天模拟惨啊...被数论水题虐炸了...+红名祭

定理

若有 𝑝1, 𝑝2 … 𝑝𝑛 互质,则对于同余方程组:

𝑥 ≡ 𝑎1 𝑚𝑜𝑑 𝑝1

  …

𝑥 ≡ 𝑎𝑛 𝑚𝑜𝑑 𝑝𝑛

在模 𝐿𝐶𝑀 = 𝑝1 ∗ ⋯ ∗ 𝑝𝑛 的意义下x有唯一解

证明

唯一性:若有两组解 𝑥1, 𝑥2 则 𝑥1 − 𝑥2 一定是 0

存在性:构造方法证明,设 

𝑀1  = 𝑝2 ∗ ⋯ 𝑝𝑛

𝑖𝑛𝑣1 = 𝑀1−1 𝑚𝑜𝑑 𝑝1

𝑥1 = 𝑎1 ∗ 𝑀1 ∗ 𝑖𝑛𝑣1 

可以发现 𝑥1 满足𝑥1 ≡ 𝑎1 𝑚𝑜𝑑 𝑝1,且对所有 𝑝2, … , 𝑝𝑛 取模为0。那么 𝑥1 + 𝑥2 + ⋯ + 𝑥𝑛 就是解。

exgcd用于求逆元

代码如下

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 chi() {
    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];  //x要为最小非负整数解
        ans = (ans+tp*x*a[i])%lcm;
    }
    return (ans+lcm)%lcm;
}

 

posted @ 2019-03-10 21:12  Mogeko  阅读(522)  评论(0编辑  收藏  举报