中国剩余定理
问题
解同余方程组
其中m1,m2,m3...mk 为两两互质的整数
求x的最小非负整数解
定理
令 即M是所有 mi 的最小公倍数
ti为同余方程的最小非负整数解
则有一个解为
通解为
特别的,最小非负整数解为(x mod M+M) mod M
证明
因为
是除mi之外的所有m的倍数
所以
,
又有
两边同时乘
得
带入
原方程组成立。
代码实现
同余式的求解可以用扩展欧几里得
void exgcd(int a,int b,int &x,int &y)
{
if(b==0){ x=1; y=0; return;}
exgcd(b,a%b,x,y);
int tp=x;
x=y; y=tp-a/b*y;
}
int china()
{
int ans=0,lcm=1,x,y;
for(int i=1;i<=k;++i) lcm*=b[i];
for(int i=1;i<=k;++i)
{
int tp=lcm/b[i];
exgcd(tp,b[i],x,y);
x=(x%b[i]+b[i])%b[i];//x要为最小非负整数解
ans=(ans+tp*x*a[i])%lcm;
}
return (ans+lcm)%lcm;
}