曹冲养猪(模板题)
题目大意
求一个最小的非负整数, 满足(为了方便,将最终解的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; }
第一次发题解,如有错误希望可以矫正