实现代码
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;//尤其要注意,再次取余,不然可能会出错 } } }