概述
核心:
首先移项,左边仅剩下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;
}
}
// 返回false表示无解
// 当所有元素的gcd无法整除常数c时,方程无整数解
const int LIM = 1e6 + 10;
int multi[LIM], ans[LIM], coefficient[LIM];
bool indeterEqualtion(int *coefficient, int *ans, int len, int c) {
if (len == 1) {
if (c % coefficient[0]) return false;
ans[0] = c / coefficient[0];
return true;
}
// init
int g = ex_gcd(coefficient[0], coefficient[1], ans[0], ans[1]);
for (int i = 2; i < len; i++)
g = ex_gcd(g, coefficient[i], multi[i - 1], ans[i]);
if (c % g) return false;
int sufmul = 1;
for (int i = len - 2; i; i--)
sufmul *= multi[i], ans[i] *= sufmul;
ans[0] *= sufmul;
return true;
}
int main(void) {
ios::sync_with_stdio(false);
coefficient[0] = 155;
coefficient[1] = 341;
coefficient[2] = 385;
indeterEqualtion(coefficient, ans, 3, 1);
for (int i = 0; i < 3; i++) {
if (i) cout << ' ';
cout << ans[i];
}
cout << endl;
return 0;
}
最后
以上就是慈祥糖豆为你收集整理的【ICPC模板】多元一次不定方程(丢番图方程)求解的全部内容,希望文章能够帮你解决【ICPC模板】多元一次不定方程(丢番图方程)求解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复