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