曹冲养猪(模板题)
题目大意
求一个最小的非负整数, 满足(为了方便,将最终解的x换成大写
)
思路
由定义得
移项整理
类似于扩展欧几里得算法式
,因此用此算法求出两个整数
符合
,
若,则方程无解。
设
我们知道性质:(证明跳过)
带入可得
这里,我们设 ,可得
总结
依次合并个方程,最后即为最终答案。
code
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
using LL = long long;
LL exgcd(LL a, LL b, LL& x, LL& y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
LL mod (LL a, LL b) {
return ((a % b) + b) % b;
}
int main() {
int n;
scanf("%d", &n);
LL a1, m1;
scanf("%lld %lld", &m1, &a1);
for (int i = 1; i < n; i++) {
LL a2, m2, x, y;
scanf("%lld %lld", &m2, &a2);
LL d = exgcd(m1, -m2, x, y);
if ((a2 - a1) % d) return puts("-1"), 0;
x = mod(x * (a2 - a1) / d, abs(m2 / d));
a1 = x * m1 + a1;
m1 = abs(m1 / d * m2);
}
printf("%lld\n", a1);
return 0;
} 第一次发题解,如有错误希望可以矫正

京公网安备 11010502036488号