二元一次不定方程学习笔记
定义
含有两个未知数,且未知数项的次数都是 的不定方程就是二元一次不定方程,一般可以化成下面的形式:
前置知识
裴蜀定理
定理:对于一个二元一次不定方程,当 存在整数解。
证明:设 ,只需证明 有整数解,因为把等式两边同时乘 即可得到 。
设 , ,则 , 则方程可以化为:
为了证明这个方程有整数解,我们可以构造一组解。设 是 在模 意义下的逆元,我们可以得到:
因为 ,所以设 , ,代入原式得:
对于方程 一定有整数解 ,故方程 一定有整数解,证毕。
辗转相除法
辗转相除法又称欧几里得(Euclid)算法,可以在 的时间复杂度内求出 ,设 ,过程如下:
这就是大多数时候求 的方法。
求解二元一次不定方程
扩展欧几里得算法 (exEuclid)
对于一个二元一次不定方程 来说,我们可以按照辗转相除法的方法来顺便求出 。
举个例子,当 时,执行辗转相除法的过程如下:
我们先考虑最后一个方程,设 为当前的 , 为当前的 ,比如上面 就等于 ,得到方程:
, 方程变为
所以现在 ,而 就是 ,所以
。
现在我们往上推,设 为上一次的 和 , 所以根据辗转相除法, ,所以方程变为:
把 和 提出来得:
这样新的解就是
,然后就可以再往上推了。这就是扩展欧几里得算法,时间复杂度和辗转相除法一样,都是 。
code
//a>=b,返回gcd(a,b),并修改x,y,使得ax+by=gcd(a,b)
int exEuc(int a, int b, int &x, int &y) {
if (b == 0) {//结束条件
x = 1, y = 0;
return a;
}
int t = exEuc(b, a % b, x, y);
int x0 = x, y0 = y;//暂记录上次的结果
x = y0, y = x0 - (a / b) * y0;
return t;
}
方程的多个解
对于一个二元一次方程 ,要么没有整数解,要么有无穷多个整数解和有限个正整数解,对于任意一组整数解 和整数 , ,满足于下面的算式的都是解:
所有整数解都可以这样算出来,这也很好理解,下面证一下:
得证。
一些题目
题意:有点多,自己看吧。
思路:
对于 ,说明无解。
对于有解,先求出 的最小正整数值,而 的最小正整数值与 的最大正整数值是一组解,反之亦然,所以判断这样算出的 的最大正整数值是否为正整数,不是直接输出最小值,是的话正整数解的个数就是 的最大值与最小值的差除以 加一。
code
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
ll exEuc(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
ll t = exEuc(b, a % b, x, y);
ll x0 = x, y0 = y;
x = y0, y = x0 - (a / b) * y0;
return t;
}
ll a, b, c;
void solve() {
scanf("%lld%lld%lld", &a, &b, &c);
ll x, y;
ll g = exEuc(a, b, x, y);
if (c % g != 0)
printf("-1\n");
else {
x = x * (c / g), y = y * (c / g);
ll a0 = a / g, b0 = b / g;
ll x0 = (x > 0 ? -1ll * floor(1.0 * x / b0) : 1ll * ceil(1.0 * (0 - x) / b0));
ll y0 = (y > 0 ? -1ll * floor(1.0 * y / a0) : 1ll * ceil(1.0 * (0 - y) / a0));
x0 += (x + x0 * b0 == 0), y0 += (y + y0 * a0 == 0);
if (y - a0 * x0 <= 0 && x - b0 * y0 <= 0)
printf("%lld %lld\n", x + x0 * b0, y + y0 * a0);
else {
ll x1 = x - b0 * y0, y1 = y - a0 * x0;
x0 = x + x0 * b0, y0 = y + y0 * a0;
printf("%lld %lld %lld %lld %lld\n", (x1 - x0) / b0 + 1, x0, y0, x1, y1);
}
}
}
int main() {
int T;
scanf("%d", &T);
while (T--)
solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】