实现代码
long long ex_gcd(long long a, long long b,long long& x,long long &y)
{
long long m;
if (b == 0)
{
x = 1;
y = 0;
return a;
}
else
{
m = ex_gcd(b, a%b, x, y);
long long t = x;
x = y;
y = t - a / b*y;
}
return m;
}
int flag = 0;
long long a1, a2, n1, n2, k1, k2;
void china_rem(long long a[], long long n[],int num)
{
flag = 0;
a1 = a[0];
n1 = n[0];
for (int i = 1; i < num; ++i)
{
a2 = a[i];
n2 = n[i];
long long d = ex_gcd(n1, n2, k1, k2);
long long c = a2 - a1;
if (c%d != 0)
{
flag = 1;
return;
}
else
{
long long t = abs(n2 / d);
k1 = (((c / d)*k1)%t + t) % t;//最小正整数解,这样子最后求得的a1才是最小正数
a1 += k1*n1;
n1 = n1 / d*n2;
a1 = (a1%n1 + n1) % n1;//尤其要注意,再次取余,不然可能会出错
}
}
}