A[]为互质数组,R[]为余数数组,a1为最终步长,r1为最终最小非负数答案,Gcd是扩展欧几里得,end为true时表示无解
bool end = false;
LL a1 = A[0],r1 = R[0];
for ( int i=1 ; i<m ; i++ )
{
LL a2 = A[i],r2 = R[i];
LL c = r2-r1,d,x,y;
Gcd( a1 , a2 , d , x , y );
if ( c%d!=0 ){ end = true; break; }
LL ma = a2/d;
x = (x*c/d%ma+ma)%ma;
r1 = a1*x+r1;
a1 = a1*a2/d;
}