中國剩余定理(學習筆記)
阿新 • • 發佈:2019-03-09
display problem 我們 include code esp com -a std 有整數解,方程組的解為x=a\(_1\)
定義:若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; }
中國剩余定理(學習筆記)