#include<iostream>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n;
ll b[N], p[N];
ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); }
ll exgcd(ll a, ll b, ll& x, ll& y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
ll g = exgcd(b, a % b, y, x);
y -= a / b * x;
return g;
}
ll inv(ll a, ll p) {
ll x, y; exgcd(a, p, x, y);
return (x % p + p) % p;
}
ll exCRT() {
for (int i = 2; i <= n; i++) {
ll p1 = p[i - 1], p2 = p[i];
ll b1 = b[i - 1], b2 = b[i];
ll g = gcd(p1, p2), d = b2 - b1;
if (d % g) return -1;
p[i] = (p1 * p2) / g;
b[i] = ((inv(p1 / g, p2 / g) * d / g) % (p2 / g)) * p1 + b1;
b[i] = (b[i] % p[i] + p[i]) % p[i];
}
return b[n];
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i] >> b[i];
}
cout << exCRT() << endl;
return 0;
}
模板——exCRT
最新推荐文章于 2022-03-07 13:46:01 发布