void exgcd(int a1,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a1%b,x,y);
int t=x;
x=y;
y=t-(a1/b)*y;
}
int CRT(int a[],int m[],int n)
{
int M=1,ans=0,t,x,y;
for(int i=0; i<n; i++)
{
M*=m[i];///M为除数乘积
}
for(int i=0; i<n; i++)
{
t=M/m[i];///除了mi以外的n-1个整数乘积
exgcd(t,m[i],x,y);///求逆元,由扩展欧几里得转换成t*ti+m[i]*y=1来求ti
ans=(ans+a[i]*x*t)%M;
}
return (ans+M)%M;
}
模板积累——中国剩余定理
最新推荐文章于 2023-07-25 18:59:37 发布