曹冲养猪(模板题)

题目大意

求一个最小的非负整数, 满足(为了方便,将最终解的x换成大写


思路

由定义得
 

移项整理
 

类似于扩展欧几里得算法式,因此用此算法求出两个整数符合


,则方程无解。




我们知道性质:(证明跳过)
 
那么,为了找到一个最小非负整数,易知只需让(2)式中的 为0,可得答案为


带入可得

这里,我们设 ,可得


总结

依次合并个方程,最后即为最终答案。


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;
}

第一次发题解,如有错误希望可以矫正