题解 P4777 【【模板】扩展中国剩余定理(EXCRT)】
实际上是同余方程组的合并
简述
如果给定
保证
现在要求找一个非负整数
数据保证
题解
现在考虑合并两个同余方程的时候该怎么做
这个可以写作
由于
整理一下后就是
通过
即
由于
由于
于是就可以将这两个同余方程合并为
代码
#include <bits/stdc++.h>
using namespace std;
typedef __int128 ll;
const int N = 1e5 + 10;
ll x, y, d; int n;
void exgcd(ll &x, ll &y, ll a, ll b) {
if(!b) d = a, x = 1, y = 0;
else exgcd(y, x, b, a % b), y -= a / b * x;
}
ll gcd(ll a, ll b) {
return b ? gcd(b, a % b) : a;
}
ll lcm(ll a, ll b) {
return a / gcd(a, b) * b;
}
ll a, b, A, B;
void merge() {
exgcd(x, y, a, A);
ll c = B - b;
if(c % d) puts("-1"), exit(0);
x = x * c / d % (A / d);
if(x < 0) x += A / d;
ll mod = lcm(a, A);
b = (a * x + b) % mod; if(b < 0) b += mod;
a = mod;
}
int main() {
scanf("%d", &n);
for(int i = 1 ; i <= n ; ++ i) {
long long _A, _B;
scanf("%lld%lld", &_A, &_B), A = _A, B = _B;
if(i > 1) merge();
else a = A, b = B;
}
printf("%lld\n", (long long)(b % a));
}