P4549 【模板】裴蜀定理
裴蜀定理(贝祖定理)
定理
对任何整数 和 ,关于未知数 和 的线性丢番图方程(称为裴蜀等式):
- 有整数解时当且仅当 是及的最大公约数的倍数。
- 裴蜀等式有解时必然有无穷多个整数解,每组解都称为裴蜀数
- 可用扩展欧几里得算法求解裴蜀数
例子
例如,和的最大公约数是,则方程有解。
事实上有:
- ...
用计算机帮着算一下:
#include <bits/stdc++.h>
using namespace std;
int main() {
for (int x = -100; x <= 100; x++)
for (int y = -100; y <= 100; y++)
if (2 * x + y * 7 == 1) cout << x << " " << y << endl;
return 0;
}
证明
看这个证明可能要好懂点
例:
那么无论如何都是偶数,换句话来说,一定是的倍数
那么同理一定是的倍数,因为上述等于 :
,外面乘了个,那么再怎么都是的倍数,
那么这个定理有什么用呢。当为整数解的时候,一定是的倍数,那么我们就可以求得当为整数解的时候,的最小值肯定就是 //最大公约数的倍。
实现代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf("%d", &n);
int d = 0, a;
for (int i = 1; i <= n; i++) {
scanf("%d", &a);
d = __gcd(d, abs(a));
}
printf("%d", d);
return 0;
}
引理
给定,均是正整数且互质,那么由不能凑出的最大数是;
解法I:采用引理解题
#include<bits/stdc++.h>
using namespace std;
int main(){
int a, b;
scanf("%d %d",&a,&b);
printf("%d\n",a*b-a-b);
return 0;
}
解法II:采用爆搜解题
#include <bits/stdc++.h>
using namespace std;
int p, q, res;
/*
测试数据:
4 7
根据公式,最大无法凑出的是:4*7-4-7=17
*/
bool dfs(int x) {
if (x == 0) return true;
if (x >= p && dfs(x - p)) return true;
if (x >= q && dfs(x - q)) return true;
return false;
}
int main() {
scanf("%d %d", &p, &q);
for (int i = 1; i <= 1000; i++)
if (!dfs(i)) res = i;
printf("%d\n", res);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-04-28 percona-toolkit安装
2019-04-28 记录赤峰项目数据库异常处理办法
2013-04-28 关于压力测试的思路
2013-04-28 Postgres与OS内核相关的几个参数设置
2013-04-28 Ubuntu下PostgreSQL数据库集群(PL/Proxy)配置方法
2013-04-28 This system is not registered with RHN
2013-04-28 PostgreSQL数据库管理:定期vacuum