中国剩余定理是求解一次线性同余方程组的方法。
中国剩余定理:
假设整数m1,m2, … ,mn两两互素,则同余方程组
有整数解。
设 是m1,m2,m3…mn的乘积,并设 是除了mi以外的n-1个整数的乘积。
设是Mi模mi的逆元(数论中的倒数)。
那么在模M下的解是唯一的。
模板代码如下:
void Extend_Euclid(int a,int b,int& x,int& y)
{
if(b == 0)
{
x = 1;
y = 0;
return; //表示程序退出,但是没有返回值
}
Extend_Euclid(b,a%b,x,y);
int temp = x;
x = y;
y = temp - (a/b) * y;
}
int CRT(int a[],int m[] ,int n)
{
int M=1;
int ans = 0;
for(int i=1;i<=n;i++)
M *= m[i];
for(int i=1;i<=n;i++)
{
int x,y;
int Mi = M/m[i];
Extend_Euclid(Mi,m[i],x,y); // 求逆元
ans = (ans + a[i]*Mi*x) % M;
}
if(ans<0)
ans += M;
return ans;
}