中国剩余定理
作者:互联网
中国剩余定理
在同余方程得以解决之后,设想有一个这样的问题:
\[\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}}\) 就好啦
CODE
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;
}
标签:剩余,le,mm,定理,times,int,中国,ll,equiv 来源: https://www.cnblogs.com/ex-asbable/p/16325002.html