zoukankan      html  css  js  c++  java
  • [笔记]中国剩余定理

    证明:

    设ti是线性同余方程Mi*ti=1(mod mi)的一个解

    因为Mi=m/mi是除mi之外所有模数的倍数,所以对于任意的k!=i,都有ai*Mi*ti≡0(mod mk)

    又因为Mi*ti≡1(mod mi),所以ai*Mi*ti≡ai(mod mi),

    所以若把$x=sum^{n}_{i=1}ai*Mi*ti$带入原方程组,发现每个方程都成立,即可得证

    使用exgcd求解同余方程

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define int long long
    using namespace std;
    const int maxn=15;
    int n,a[maxn],b[maxn];
    int exgcd(int a,int b,int &x,int &y){
        if(b==0){
            x=1,y=0;return a;
        }
        int d=exgcd(b,a%b,x,y);
        int z=x;
        x=y;
        y=z-a/b*y;
        return d;
    }
    int inv(int a,int b){//a在mod b下逆元 
        int x,y;
        exgcd(a,b,x,y);
        return (x%b+b)%b;
    }
    int crt(){
        int M=1,ans=0;
        for(int i=1;i<=n;i++)M*=b[i];
        for(int i=1;i<=n;i++)
        (ans+=a[i]*(M/b[i])*inv(M/b[i],b[i]))%=M;
        return (ans+M)%M;
    }
    signed main(){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)scanf("%lld%lld",&b[i],&a[i]);
        printf("%lld",crt());
    }
  • 相关阅读:
    第七章读书笔记
    第八章读书笔记
    第五章读书笔记
    第六章读书笔记
    总结
    第四章读书笔记
    第十一章读书笔记
    第十章读书笔记
    第九章读书笔记
    第八章读书笔记
  • 原文地址:https://www.cnblogs.com/superminivan/p/10885823.html
Copyright © 2011-2022 走看看