【ICPC模板】多元一次不定方程(丢番图方程)求解

核心:

首先移项,左边仅剩下ax + by,使用扩展欧几里得求解x和y,其右侧值应当满足能够整除gcd(a, b),接着用扩展gcd求解gcd(a, b)和c的参数,c的参数z将作为中间过程的答案,而gcd(a, b)的倍数将用来给前面求过的所有结果翻倍,以此类推。

方程有解当且仅当右侧常数c能够整除gcd(a, b, c, d……)。

代码:

#include <iostream>
#include <vector>

using namespace std;

typedef long long LL;

int ex_gcd(int a, int b, int &x, int &y) {
    int xp, xpp, yp, ypp;
    int r, q;
    q = a / b, r = a % b;
    xpp = x = 0, ypp = y = 1;
    if (!r) return b;
    xp = x = 1, yp = y = -q;
    while (true) {
        a = b, b = r;
        q = a / b, r = a % b;
        if (!r) return b;
        x = xpp - xp * q;
        y = ypp - yp * q;
        xpp = xp, ypp = yp;
        xp = x, yp = y;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值