// 扩展欧几里得算法,计算 ax + by = gcd(a,b) 的解 intexgcd(int a, int b, int &x, int &y){ if (b == 0) { x = 1; y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= (a / b) * x; return d; }
// 计算 a 关于模 m 的逆元(假设 a 和 m 互质) intmodInverse(int a, int m){ int x, y; exgcd(a, m, x, y); x %= m; if (x < 0) x += m; return x; }
// 扩展欧几里得 intexgcd(int a, int b, int &x, int &y){ if (b == 0) { x = 1; y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= (a / b) * x; return d; }
// 计算逆元 intmodInverse(int a, int m){ int x, y; exgcd(a, m, x, y); x %= m; if (x < 0) x += m; return x; }
// 中国剩余定理主函数 // 输入:模数数组 m,余数数组 a // 返回 x,满足 x ≡ a[i] (mod m[i]) longlongCRT(const vector<int>& m, const vector<int>& a){ longlong M = 1; int n = m.size(); for (int i = 0; i < n; ++i) M *= m[i];
longlong x = 0; for (int i = 0; i < n; ++i) { longlong Mi = M / m[i]; longlong yi = modInverse(Mi % m[i], m[i]); x = (x + Mi * yi % M * a[i] % M) % M; } return (x + M) % M; }
intmain(){ vector<int> m = {3, 5, 7}; vector<int> a = {2, 3, 2}; cout << "解为 x = " << CRT(m, a) << endl; // 输出 23 return0; }
#include<iostream> usingnamespace std; constint N = 10; int n; longlong r[N], p[N], M = 1;
longlongCRT(){ longlong ans = 0; for (int i = 0; i < n; i ++) M *= p[i];
for (int i = 0; i < n; i ++) { longlong m = M / p[i]; for (int j = 1; j <= 1e7; j ++) { if (m * j % p[i] == r[i]) { ans += m * j; break; } } } return ans % M; }
#include<cstdio> int n; longlong a[100010], b[100010], ans, M, x, y; longlongexgcd(longlong a, longlong b, longlong &x, longlong &y){ if(!b){ x = 1; y = 0; return a; } longlong d = exgcd(b, a % b, x, y); longlong z = x; x = y; y = z - (a / b) * y; return d; } longlongSlow_Mul(longlong n, longlong k, longlong mod){ longlong ans = 0; while(k){ if(k & 1) ans = (ans + n) % mod; k >>= 1; n = (n + n) % mod; } return ans; } intmain(){ scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%lld%lld", &b[i], &a[i]); ans = a[1]; M = b[1]; for(int i = 2; i <= n; ++i){ longlong B = ((a[i] - ans) % b[i] + b[i]) % b[i]; longlong GCD = exgcd(M, b[i], x, y); x = Slow_Mul(x, B / GCD, b[i]); ans += M * x; M *= b[i] / GCD; ans = (ans + M) % M; } printf("%lld\n", ans); return0; }