20 线性丢潘图方程(Diophantine equation)
线性丢番图方程(Diophantine equation)通常指的是形如 的方程,其中 是整数,而我们感兴趣的是找到整数解 。
孩子们,牛客周赛77第三题会这个秒杀了(怪不得那群人可以20min ak,全是板子题)
存在解的情况下, 满足以下条件
- c 必须是 a 和 b 的最大公约数 (gcd) 的倍数
具体而言,当 时存在 使上述方程存在整数解
- 扩展:
- 若上述条件满足,则存在无穷多组解 ,一旦找到一组特殊的解,则所有解都可以被表示出来,其表示方式如下
- 其中
其具体作用为,在确定线性丢潘图方程有解的情况,可以使用扩展欧几里得算法展欧几里得算法找出其中一个特解 , 然后找出所有解的通项
找出丢潘图方程通项代码模板
需要用到扩展欧几里得算法进行实现
- 如下:
#include <bits/stdc++.h>
using namespace std;
// 扩展欧几里得算法
int exgcd(int a, int b, int &x, int &y)
{
if (b == 0) {
x = 1;
y = 0;
return a; // 返回gcd(a, b)
}
int r = exgcd(b, a % b, x, y);
int t = y;
y = x - (a / b) * y;
x = t;
return r;
}
int main()
{
int a, b, c;
cout << "请输入线性丢番图方程(ax+by=c)的系数a, b和常数c : " << endl;
cin >> a >> b >> c;
int g = __gcd(a, b); // 计算gcd(a, b)
if (c % g != 0) {
cout << "方程无整数解." << endl;
return 0;
}
// 使用扩展欧几里得算法找到一个特解
int x0, y0;
exgcd(a / g, b / g, x0, y0);
x0 *= c / g;
y0 *= c / g;
cout << "一个特解为: x = " << x0 << ", y = " << y0 << endl;
// 输出一般解
cout << "一般解的形式为:" << endl;
cout << "x = " << x0 << " + " << b / g << " * k" << endl;
cout << "y = " << y0 << " - " << a / g << " * k" << endl;
cout << "其中k为任意整数." << endl;
return 0;
}
Tip
由于 已经是 和 的最大公约数,因此 和 互质(即它们的最大公约数为1)。这样做的目的是为了简化问题,使得新的系数 和 成为互质的整数,从而可以使用扩展欧几里得算法来求解简化后的方程。
因为有了简化过程,所以结果出来时要乘上 来回复正常解