中国剩余定理(孙子定理)

设m1,m2…mk是k个两两互素的正整数
则同余方程组:
x ≡ a1(mod m1)
x ≡ a2(mod m2)
… …
x ≡ ak(mod mk)
记m=m1*m2*m3……mk
有bj使

mmjbj1 (mod mj)

x=i=1kmmjajbj

ps:x不一定是最小的需要mod m

例题:求下列同余方程组最小解
x≡2 mod 3
x≡1 mod 4
x≡3 mod 5

input:
3
2 3
1 4
3 5
output:
53

code

#include<cstdio>
int n;
int mj[100],aj[100];
//mj[]指除数,aj[]指余数 

int szdl(){
    int m=1,x=0;
    for(int i=1;i<=n;i++) {
        int mm=m/mj[i];
        for(int j=1;;j++) 
            if((mm*j)%mj[i]==1) {
                x+=mm*j*aj[i];
                break;
            }
    }
    return x%m;//注意%m
}

int main(){
//  while(~scanf("%d %d",&aj[++n],&mj[++n]));
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d %d",&aj[i],&mj[i]);
        m*=mj[i];
    }
    printf("%d",szdl());
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9248055.html