1. 程式人生 > >中國剩余定理(學習筆記)

中國剩余定理(學習筆記)

display problem 我們 include code esp com -a std

定義:若m\(_1\),m\(_2\) \(\cdots\)m\(_n\)是兩兩互質的正整數,M= \(\prod_{i=1}^n{m_i}\),M\(_i\)=M/m\(_i\),t\(_i\)是線性同余方程M\(_i\)t\(_i\)≡1(mod m\(_i\))的一個解.對於任意的n個整數a\(_1\),a\(_2\) \(\cdots\) a\(_n\),則同余方程組:

\[\begin{cases}x≡a_1(mod)m_1\\x≡a_2(mod)m_2\\ \cdots \cdots\\x≡a_n(mod)m_n\\\end{cases}\]

有整數解,方程組的解為x=a\(_1\)
M\(_1\)t\(_1\)+a\(_2\)M\(_2\)t\(_2\)+ \(\cdots\) +a\(_n\)M\(_n\)t\(_n\).並且在\(\mod M\)意義下有唯一解.

證明:因為M\(_i\)=M/m\(_i\)是除m\(_i\)之外所有模數的倍數,所以\(\forall\)k\(\not=\)i,a\(_i\)M\(_i\)t\(_i\)≡0(mod m\(_k\)).又因為a\(_i\)M\(_i\)t\(_i\)≡a\(_i\)(mod m\(_i\)),所以代入\(x=\sum_{i=1}^{n}{a_iM_it_i}\),成立.

結論:中國剩余定理給出了模數兩兩互質的線性同余方程組的一個特殊解.方程組的通解可以表示為x+kM(k∈Z).有些題目要求我們求出最小的非負整數解,只需把x對M取模,並讓x落在0~M-1的範圍內即可.

因為條件中有t\(_i\)是線性同余方程M\(_i\)t\(_i\)≡1(mod m\(_i\))的一個解,所以學習中國剩余定理之前需要學習如何求解線性同余方程,不得不要的廣告.

直接來一道模板題,曹沖養豬

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n,M=1;
LL a[15],b[15];
LL exgcd(LL a,LL b,LL &x,LL &y){
    if(b==0){x=1;y=0;return a;}
    LL d=exgcd(b,a%b,y,x);
    y-=x*(a/b);
    return d;
}
void Intchina(){
    LL x,y,ans=0;
    for(LL i=1;i<=n;i++){
        LL Mi=M/a[i];
        exgcd(Mi,a[i],x,y);
        ans=((ans+Mi*x*b[i])%M+M)%M;
    }
    printf("%lld\n",ans);
}
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&a[i],&b[i]);
        M*=a[i];
    }
    Intchina();
    return 0;
}

中國剩余定理(學習筆記)