核心:
首先移项,左边仅剩下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;
}
}