在同余方程得以解决之后,设想有一个这样的问题:
\[\begin{cases}x\equiv a_1\pmod{m_1}\\x\equiv a_2\pmod{m_2}\\\cdots\\x\equiv a_n\pmod{m_n}\end{cases} \]\(2\le n\le 10\) , \(0\le a_i<m_i\le 10^5\) , \(1\le \prod m_i\le 10^{18}\) , 对于 \(\forall m_i\) , \(m_j(i,j\in [1,n])\) 有 \(m_i\bot m_j\) 就是两两互质
要求最小正整数解 \(x\)
例题点这里
设 \(mm=\prod\limits_{i=1}^n{m_i}\) , \(M_i(1\le i\le n)\) 表示 \(\dfrac{mm}{M_i}\)
那么就有了一个特解: \(x_0=\sum\limits_{i=1}^n{a_i\times M_i\times M_i^{-1}}\)
最小正整数解则就是 \(x_0\) 对所有 \(m_i(1\le i\le n)\) 的最小公倍数取余
因为 \(m_i(1\le i\le n)\) 两两互质,则它们的最小公倍数等于 \(m\) 。即 \(x_{min}=((x_0\bmod mm)+mm)\bmod mm\)
如何证明?
看第一个式子: \(x\equiv a_1\pmod{m_1}\)
当 \(x=\sum\limits_{i=1}^n{a_i\times M_i\times M_i^{-1}}\) 时,首先 \(x=a_1\times M_1\times M_1^{-1}+\sum\limits_{i=2}^n{a_i\times M_i\times M_i^{-1}}\)
看后面一堆 \(\sum\limits_{i=2}^n{a_i\times M_i\times M_i^{-1}}\) 中有一个 \(M_i\) 因子,且 \(i\ge 2\) ,则 \(M_i\) 中一定含 \(m_i\) 的因子,模 \(m_i\) 则一定为 \(0\) 。因此后面一堆模 \(m_i\) 一定为 \(0\) 。
再看前面一堆 \(a_1\times M_1\times M_1^{-1}\) ,此时 \(M_1\) 模 \(m_i\) 一定不为 \(0\) ,则 \(a_1\times M_1\times M_1^{-1}\equiv a_1\pmod {m_i}\)
所以满足 \(x\equiv a_1\pmod{m_1}\)
同理,对于 \(\forall a_i\) ,均满足 \(x\equiv a_i\pmod{m_i}\)
那么只需要求 \(x_0=\sum\limits_{i=1}^n{a_i\times M_i\times M_i^{-1}}\) 就好啦
const int mn=10+10; const int mm=1e5+10; const int mod=1e9+7; const int inf=0x3f3f3f3f; const int fni=0xc0c0c0c0; ll n,a[mn],m[mn],M[mn],mm; inline void read_init(){ n=read<ll>();mm=1; for(int i=1;i<=n;i++){ m[i]=read<ll>(); mm*=m[i];a[i]=read<ll>(); } } ll exgcd(ll a,ll b,ll &x,ll &y){ if(!b){ x=1;y=0; return a; } ll d=exgcd(b,a%b,y,x); y=y-(a/b)*x; return d; } int main(){ read_init(); ll ans=0; for(int i=1;i<=n;i++) M[i]=mm/m[i]; for(int i=1;i<=n;i++){ ll x,y; exgcd(M[i],m[i],x,y); x%=m[i]; if(x<0)x+=m[i]; ans+=a[i]*M[i]*x; ans%=mm; } write((ans%mm+mm)%mm,1); return 0; }