[笔记]中国剩余定理

证明:

设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());
}

 

posted @ 2019-05-18 15:06  羊肉汤泡煎饼  阅读(105)  评论(0编辑  收藏  举报