【算法模板】数论:裴蜀定理

概念

裴蜀定理(Bézout’s Identity)是数论中的一个重要定理,涉及整数的线性组合。定理陈述如下:

对于任何整数 a 和 b,如果 d 是 a 和 b 的最大公约数,那么存在整数 x 和 y 使得: ax+by=d

换句话说,最大公约数 d 可以表示为 a 和 bbb 的线性组合。

欧几里得算法证明

欧几里得算法是一种用于计算两个整数的最大公约数的算法。我们可以利用这个算法来证明裴蜀定理。

  1. 算法步骤:
    • 如果 b=0 ,那么 a 就是 a 和 b 的最大公约数。此时 a=d ,且 a⋅1+b⋅0=a。
    • 否则,令 r 是 a 除以 b 的余数,即 a=bq+r ,其中 q 是商。然后用欧几里得算法递归地计算 b 和 r 的最大公约数。
  2. 证明过程:
    • 首先,我们知道 d=gcd⁡(a,b) 也是 d=gcd⁡(b,r) ,因为 r=a−bq 。根据递归过程,我们可以不断减小问题的规模,最终在某一步骤中,我们会得到 r=0 ,此时 b 是最大公约数。
    • 在每一步,我们可以记录线性组合的形式。具体来说: r=a−bq 如果我们知道 b 和 r 的最大公约数可以写成: b⋅x1+r⋅y1=d 那么我们可以用 r=a−bq 替换 r: b⋅x1+(a−bq)⋅y1=d 展开并整理得到: a⋅y1+b⋅(x1−qy1)=d 因此,我们可以看到 d 依然是 a 和 b 的线性组合。
  3. 详细的证明递归部分:
    • 初始情况:如果 b=0 ,则最大公约数 d=a ,且 a⋅1+b⋅0=a ,此时 x=1 和 y=0 。
    • 递归情况:使用欧几里得算法得到 a=bq+r ,则 gcd⁡(a,b)=gcd⁡(b,r) ,我们可以继续应用算法到 b 和 r 。通过递归地应用线性组合,我们最终可以写出最大公约数的形式。

通过这个过程,我们证明了裴蜀定理,即对于任何两个整数 a 和 b,它们的最大公约数 d 总可以表示成它们的某个线性组合形式 ax+by=d 。

推广

对于任意整数 a1,a2,…,an ,如果 d 是这些整数的最大公约数,那么存在整数 x1,x2,…,xn 使得: a1x1+a2x2+⋯+anxn=d

换句话说,多个整数的最大公约数 d 可以表示为这些整数的线性组合。

模板

inline int gcd(int x, int y) { return y ? gcd(y, x % y) : !x; }
int n;
int main() {scanf("%d", &n);int ans = 0, tmp;for (int i = 1; i <= n; i++) {scanf("%d", &tmp);if (tmp < 0) tmp = -tmp;ans = gcd(ans, tmp);}printf("%d", ans);
}

模板题

P4549 【模板】裴蜀定理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

给定一个包含 n 个元素的整数序列 A,记作 A1, A2, A3, …, An。

我们的目标是求另一个包含 n 个元素的待定整数序列 X,其中 S = ∑(Ai × Xi)(i 从 1 到 n)。要求 S > 0 且 S 尽可能的小。

#include <bits/stdc++.h>
using namespace std;int main(){int n;cin>>n;vector<int> v(n);for(int &i:v)cin>>i;int g=v.front();for(int i:v)g=gcd(g,i);cout<<g<<endl;return 0;
}

B-Crash Test_2024牛客暑期多校训练营3 (nowcoder.com)

我们考虑以下碰撞测试的简化版本。最初,汽车的前部朝向墙壁,距离墙壁 D 米。该碰撞测试提供了 n 种助推器,其中第 i 种助推器的推力性能为 h,并且每种类型的助推器都有充足的数量。假设汽车前部和墙壁之间的当前距离为 d,我们使用推力性能为 h 的助推器。当 d≥h 时,汽车将向前移动 h 米,然后停止。否则,汽车将向前移动 d 米,撞到墙上,然后反弹 h−d 米,然后停下来,仍然面向墙壁。

现在,您想知道,通过任意数量的操作(包括无操作),汽车前部和墙壁之间的最小距离是多少?

#include <bits/stdc++.h>
using namespace std;
#define int long longsigned main() {int n,m;cin>>n>>m;vector<int> v(n);for(int &i:v)cin>>i;int g=v.front();for(int i:v)g=gcd(g,i);int x=m/g;cout<<min(m-x*g,(x+1)*g-m);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第19天|ResNet50 图像分类案例:数据集、训练与预测可视化

目录 环境配置 数据集加载 数据集可视化 Building Block Bottleneck 构建ResNet50网络 模型训练与评估 可视化模型预测 环境配置 首先指出实验环境预装的 mindspore 版本以及更换版本的方法。然后&#xff0c;它卸载了已安装的 mindspore 并重新安装指定的 2.3.0rc1 版本…

值得买科技与MiniMax达成官方合作伙伴关系,共建融合生态

7月29日&#xff0c;值得买科技与大模型公司MiniMax宣布达成官方合作伙伴关系。 MiniMax旗下大模型产品海螺AI现已接入值得买“消费大模型增强工具集”&#xff0c;基于海螺AI比价策略&#xff0c;用户可通过海螺AI“悬浮球”功能实现快速比价及跳转购买。 此次合作也标志着值…

4.仓颉编程_使用Console.stdIn.read()实现c语言的控制台scanf或getchar()的读取输入字符功能

使用Console.stdIn.readln()实现c语言的控制台scanf或getchar()的读取输入字符功能 try catch捕捉异常 import std.console.*main() {println("请输入字符. 按q退出:")try {//读取一个字符var ch2 Console.stdIn.read().getOrThrow()//判断输入的是否是字符q,如果…

Day.32 | 518.零钱兑换 II 377.组合总和 Ⅳ

518.零钱兑换 II 要点&#xff1a;先遍历数组&#xff0c;后遍历背包&#xff0c;求的是组合数 class Solution { public:int change(int amount, vector<int>& coins) {vector<int> dp(amount 1, 0);dp[0] 1;for (int i 0; i < coins.size(); i) {for…

docker compose 和 docker-compose 两个命令等价吗

docker compose 和 docker-compose 这两个命令虽然看起来很相似,但实际上有一些重要的区别: 实现方式不同: docker-compose 是用 Python 编写的独立工具[2][4]。docker compose 是用 Go 语言重写的,作为 Docker CLI 的一个插件[1][4]。 集成度不同: docker compose 作为 Docke…

Window 下 Vim 环境安装踩坑问题汇总及解决方法

导航 Linux 下Mamba 及 Vim 安装问题参看本人之前博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法Linux 下Vmamba 安装教程参看本人之前博客&#xff1a;Vmamba 安装教程&#xff08;无需更改base环境中的cuda版本&#xff09;Windows 下 VMamba的安装参看本人之前博客…

操作系统重点总结

文章目录 1. 操作系统重点总结1.1 操作系统简介1.1.1 操作系统的概念和功能1.1.2 操作系统的特征1.1.2.1 并发1.1.2.2 共享1.1.2.3 虚拟1.1.2.4 异步 1.1.3 操作系统的发展与分类1.1.4 中断和异常1.1.5 系统调用1.1.6 操作系统的体系结构1.1.7 操作系统简介总结 1.2 进程1.2.1 …

使用YApi平台来管理接口

快速上手 进入YApi官网&#xff0c;进行注册登录https://yapi.pro/添加项目 3. 添加分类 4. 添加接口 5. 添加参数 添加返回数据 可以添加期望 验证 YAPI&#xff08;Yet Another Practice Interface&#xff09;是一个现代化的接口管理平台&#xff0c;由淘宝团队…

【Python Tips】使用func_timeout库实现os.system()命令行的超时报错检测

一、引言 有时候在python项目代码中使用 os.system() 使用命令行调用外部程序或者函数时&#xff0c;由于我们不知道外部程序会不会因为一些未知原因崩掉&#xff0c;但我们又不想项目代码因此中断&#xff0c;因此&#xff0c;我们可以使用已有的func_timeout库来实现超时检测…

Python性能优化:代码加速与内存管理技巧

在Python编程中&#xff0c;性能优化往往是一个重要但常被忽视的话题。尽管Python以其简洁易读的语法和强大的标准库赢得了广泛的开发者基础&#xff0c;但在处理大规模数据或高性能要求的应用时&#xff0c;其解释执行和动态类型系统的特性可能会成为性能瓶颈。本文将探讨一系…

企业邮箱如何进行邮件监控

企业邮箱监控保障资产安全、合规性&#xff0c;防范网络攻击&#xff0c;提升员工行为。核心要素包括内容扫描、行为分析、合规性检查等。实施策略涉及技术选择、政策制定、员工培训。企业邮箱如何进行邮件监控呢&#xff1f;Zoho邮箱的eDiscovery功能可实现长期邮件保存和监控…

基于百度paddle检索系统的召回

所谓召回&#xff0c;无非就是用一段不规则文本模拟用户query查询&#xff0c;而要召回的是标准的titlekey,这些是要构建索引库的&#xff0c;所有相似文本对的第二个文本必须要在索引库里存在&#xff0c;不然就没法评估,因为标记都是0,还有召回1&#xff0c;召回5等,并不是什…

在Ubuntu 22 VPS服务器上更改phpMyadmin端口的方法

更改 Ubuntu 22 VPS服务器上的 phpMyAdmin 端口可以增强安全性和可管理性。但是具体应该怎么操作呢&#xff1f;接下来将带您了解在Ubuntu 22 VPS 服务器上更改phpMyadmin的端口全过程&#xff0c;一起来看看吧。 准备你的环境 在开始之前&#xff0c;让我们先确保你已做好一…

【前端逆向】最佳JS反编译利器,原来就是chrome!

有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么&#xff0c;有没有重复加载&#xff1f;此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件&#xff0c;某某Beautify等等。但这些插件看人品&#xff0c;运气不好搞的话&#xff0c;反…

Vue 项目中 marked.js 怎么定制链接的点击行为

在 Vue 3 组件中使用 marked.js 并定义有效的 handleLinkClick 函数&#xff0c;你可以采用以下几种方法&#xff1a; 使用组件方法和全局函数 在你的 Vue 组件中定义 handleLinkClick 方法&#xff0c;然后将其暴露到全局作用域&#xff1a; <template><div v-htm…

嵌入式软件文件目录

以下是一个清爽的文件夹分类建议&#xff0c;适用于大多数嵌入式软件项目&#xff1a; 1. 根目录 README.md&#xff1a;项目简介、安装步骤、配置说明等。LICENSE&#xff1a;项目使用的许可证文件。 2. 源代码目录 2.1 src 存放所有源代码文件。 2.2 子目录划分 bsp&a…

实验2-3-8 计算火车运行时间

//实验2-3-8 计算火车运行时间 /* 输入格式&#xff1a;输入在一行中给出2个4位正整数&#xff0c;其间以空格分隔&#xff0c;分别表示火车的出发时间和到达时间。 每个时间的格式为2位小时数&#xff08;00-23&#xff09;和2位分钟数&#xff08;00-59&#xff09;&#xff…

Mysql中DML的几种操作

DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;是SQL中用于添加、删除、更新和查询数据库记录的一类语句。在MySQL中&#xff0c;DML主要包括以下几种操作&#xff1a; 1. 插入&#xff08;INSERT&#xff09; 用途&#xff1a;向表中插入新…

类方法的分析和举例

在Python中&#xff0c;类方法是一种与类相关联的方法&#xff0c;而不是与类的实例相关联。类方法可以通过在方法定义时使用classmethod装饰器来创建。类方法的第一个参数通常是cls&#xff0c;它代表类本身&#xff0c;而不是类的实例。 class MyClass:class_attribute &qu…

ArcGIS for js SketchViewModel绘制点、线、面和圆(vue代码)

引入依赖&#xff08;前提要加载地图&#xff09;&#xff1a; import SketchViewModel from "arcgis/core/widgets/Sketch/SketchViewModel.js";import GraphicsLayer from "arcgis/core/layers/GraphicsLayer.js"; 创建SketchViewModel对象&#xff1a…