AcWing 204. 表达整数的奇怪方式
原题链接
中等
作者:
捡到一束光
,
2020-05-20 17:15:58
,
所有人可见
,
阅读 637
#include <iostream>
using namespace std;
// 固定形式:x = kimi + ai
// 核心方程:x = k[m1, m2] + k1m1 + a1;
// 扩展欧几里得算法得到 k1某个解:k1 + k*m2/ d
typedef long long LL;
LL exgcd(LL a, LL b, LL &x, LL &y) {
if (!b) {
x = 1, y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main() {
int n;
cin >> n;
LL m1, a1, m2, a2, k1, k2;
cin >> m1 >> a1; // 当前合并好的方程用 m1 a1来表示
LL x = 0;
for (int _ = 0; _ < n - 1; _ ++) {
cin >> m2 >> a2;
// m1k1 - m2k2 = (m1, m2);
LL d = exgcd(m1, m2, k1, k2); // k2实际是-k2,但这里无所谓
if ((a2 - a1) % d != 0) {
x = -1;
break;
} else {
k1 *= (a2 - a1) / d; // m1k1 - m2k2 = a2 - a1;
LL t = m2 / d;
k1 = (k1 % t + t) % t; // k1 不能太大
x = k1*m1 + a1; // 此时m1 和 a1 还不能更新
a1 = k1*m1+a1;
m1 = m1 * m2 / d;
}
}
if (x != -1) {
x = (x % m1 + m1) % m1;
}
cout << x << endl;
return 0;
}