算法学习系列(二十九):裴蜀定理、扩展欧几里得算法

目录

  • 引言
  • 一、裴蜀定理
  • 二、扩展欧几里得算法模板
  • 三、公式推导
  • 四、例题
    • 1.扩展欧几里得算法模板题
    • 2.线性同余方程

引言

这个扩展欧几里得算法用的还是比较多的,而且也很实用,话不多说直接开始吧。

一、裴蜀定理

裴蜀定理:对于任意正整数 a 和 b ,一定存在非零整数 x 和 y ,使得 a x + b y = g c d ( a , b ) 裴蜀定理:对于任意正整数a和b,一定存在非零整数x和y,使得ax+by=gcd(a,b) 裴蜀定理:对于任意正整数ab,一定存在非零整数xy,使得ax+by=gcd(a,b)
也就是说a和b能凑出来的最小正整数就是它们的最大公约数

二、扩展欧几里得算法模板

给出 a 和 b , 求满足 a x + b y = g c d ( a , b ) 中任一 x 和 y 的值 给出a和b,求满足ax+by=gcd(a,b)中任一x和y的值 给出ab,求满足ax+by=gcd(a,b)中任一xy的值

int exgcd(int a, int b, int& x, int& y)
{if(!b){x = 1, y = 0;return a;}int d = exgcd(b, a%b, y, x);y -= a / b * x;return d;
}

三、公式推导

a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
当 b 为 0 , g c d ( a , b ) = a , a x + y ∗ 0 = a , 则一组解为 x = 1 , y = 0 当b为0,gcd(a,b)=a,ax+y*0=a,则一组解为x=1,y=0 b0gcd(a,b)=aax+y0=a,则一组解为x=1,y=0
g c d ( a , b ) = g c d ( b , a m o d b ) , a m o d b = a − ( a b ) ∗ b , 注:此处的 a b 都为下取整, gcd(a,b) = gcd(b,a \mod\ b),a\mod b=a-(\frac{a}{b})\ *\ b,注:此处的\frac{a}{b}都为下取整, gcd(a,b)=gcd(b,amod b),amodb=a(ba)  b,注:此处的ba都为下取整,
则 b y + ( a m o d b ) x = d , b y + ( a − ( a b ) ∗ b ) x = d , 则by+(a\mod b)x=d,by+(a-(\frac{a}{b})*b)x=d, by+(amodb)x=d,by+(a(ba)b)x=d,
则 a x + b ( y − ( a b ) ∗ x ) = d 则ax+b(y-(\frac{a}{b})*x)=d ax+b(y(ba)x)=d

四、例题

1.扩展欧几里得算法模板题

题目描述:

给定 n 对正整数 ai,bi,对于每对数,求出一组 xi,yi,使其满足 ai×xi+bi×yi=gcd(ai,bi)。输入格式
第一行包含整数 n。
接下来 n 行,每行包含两个整数 ai,bi。输出格式
输出共 n 行,对于每组 ai,bi,求出一组满足条件的 xi,yi,每组结果占一行。
本题答案不唯一,输出任意满足条件的 xi,yi 均可。数据范围
1≤n≤105,1≤ai,bi≤2×109
输入样例:
2
4 6
8 18
输出样例:
-1 1
-2 1

示例代码:

#include <cstdio>
#include <iostream>using namespace std;int exgcd(int a, int b, int& x, int& y)
{if(!b){x = 1, y = 0;return a;}int d = exgcd(b, a%b, y, x);y -= a / b * x;return d;
}int main()
{int n;scanf("%d", &n);while(n--){int a, b, x, y;scanf("%d%d",&a, &b);exgcd(a, b, x, y);printf("%d %d\n", x, y);}return 0;
}

2.线性同余方程

题目描述:

给定 n 组数据 ai,bi,mi,对于每组数求出一个 xi,使其满足 ai×xi≡bi(modmi),如果无解则输出 impossible。输入格式
第一行包含整数 n。
接下来 n 行,每行包含一组数据 ai,bi,mi。输出格式
输出共 n 行,每组数据输出一个整数表示一个满足条件的 xi,如果无解则输出 impossible。
每组数据结果占一行,结果可能不唯一,输出任意一个满足条件的结果均可。
输出答案必须在 int 范围之内。数据范围
1≤n≤105,1≤ai,bi,mi≤2×109
,输入样例:
2
2 3 6
4 3 5
输出样例:
impossible
-3

求 a x ≡ b ( m o d m ) ,即 a x = m y + b , 即 a x − m y = b , 求ax \equiv b \pmod m,即ax=my+b,即ax-my=b, axb(modm),即ax=my+b,axmy=b
令 y ′ = − y , 则 a x + m y ′ = b , 令y\prime =-y,则ax+my\prime=b, y=y,ax+my=b,
又存在 a x + m y ′ = g c d ( a , m ) , 又存在ax+my\prime = gcd(a,m), 又存在ax+my=gcd(a,m),
所以只要判断 b 是否为 g c d ( a , m ) 的倍数即可判断是否存在,并且 r e s = b g c d ( a , m ) ∗ x 所以只要判断b是否为gcd(a,m)的倍数即可判断是否存在,并且res=\frac{b}{gcd(a,m)}*x 所以只要判断b是否为gcd(a,m)的倍数即可判断是否存在,并且res=gcd(a,m)bx

示例代码:

#include <cstdio>
#include <iostream>using namespace std;typedef long long LL;int exgcd(int a, int b, int& x, int& y)
{if(!b){x = 1, y = 0;return a;}int d = exgcd(b, a % b, y, x);y -= a / b * x;return d;
}int main()
{int n;scanf("%d", &n);while(n--){int a, b, m, x, y;scanf("%d%d%d", &a, &b, &m);int d = exgcd(a, m, x, y);if(b % d == 0) printf("%lld\n", (LL)x * (b / d) % m);else puts("impossible");}return 0;
}

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

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

相关文章

Android保存图片到系统图库并通知系统相册刷新

1.场景 在android开发中保存应用的图片并插入到系统图库同时通知相册刷新的功能&#xff0c;做完后发现在部分手机上出现虽然图片保存成功了&#xff0c;但是相册却找不到图片的问题&#xff0c;查找文件夹图片也已经存在&#xff0c;可就是在相册里刷新不出来。 2.思路 2.1.…

应急消防应用步入“繁花”时代,卓翼智能消防无人机顺势而行大有可为

近日&#xff0c;北京卓翼智能科技有限公司&#xff08;以下简称“卓翼智能”&#xff09;宣布完成超亿元B轮融资&#xff0c;融资金额高达2.5亿元。这个“智能无人系统”黑马品牌&#xff0c;凭什么出圈&#xff1f;重点发力在哪些领域呢&#xff1f;今天&#xff0c;带你走进…

2726. 使用方法链的计算器

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 设计一个类 Calculator 。该类应提供加法、减法、乘法、除法和乘方等数学运算功能。同时&am…

设计模式-生成器设计模式

什么是生成器设计模式 众所周知我们设计代码的时候要将代码设计出模块化的&#xff0c;一个功能是一个模块&#xff0c;那么生成器设计模式&#xff0c;是将一个类再度进行了一个拆分&#xff0c;让一个类的内部进行了单一职责化&#xff0c;其实我们在平时开发的时候就会不经…

分布式id-Leaf算法

一、介绍 由美团开发&#xff0c;开源项目链接&#xff1a;https://github.com/Meituan-Dianping/Leaf Leaf同时支持号段模式和snowflake算法模式&#xff0c;可以切换使用。ID号码是趋势递增的8byte的64位数字&#xff0c;满足上述数据库存储的主键要求。 Leaf的snowflake模…

交叉导轨为何要保持日常清洁?

在工业自动化的发展中&#xff0c;交叉导轨因其具有精度高、高刚性、高耐磨性等特点&#xff0c;在数控技术的发展中得到了越来越多的使用&#xff0c;对于交叉导轨来说&#xff0c;保持日常清洁对其性能和寿命具有重要意义。 1、防止灰尘和杂质的侵入&#xff1a;交叉导轨在机…

嵌入式学习第十一天

1.数组和指针的关系: 1.一维数组和指针的关系: int a[5] {1, 2, 3, 4, 5}; int *p NULL; p &a[0]; p a; 数组的数组名a是指向数组第一个元素的一个指针常量 a &a[0] a 的类型可以理解为 int * 有两种情况除…

五步安装和配置CLion的ESP-IDF开发框架

记录CLion安装和配置ESP-IDF开发框架 真无语了&#xff0c;弄了半天多&#xff0c;近一天&#xff0c;这里弄那里弄。记录一下&#xff0c;万一后面还要踩坑呢&#xff01; 弄一早上components的编写和使用&#xff08;想用别人的components&#xff09;&#xff0c;下午弄开…

Java基础-实现猜数字小游戏

1. 实现控制台的猜数字游戏。游戏运行时产生一个1~100之间的随机数字&#xff1b; 2. 要求用户从控制台输入数字&#xff0c;若输入的数字比随机数小&#xff0c;则提示太小了&#xff1b;若输入的数字比随机数大&#xff0c;则提示太大了&#xff0c;若输入的数字与随机数相同…

JavaScript学习-原型和原型链

原型和原型链 示例代码 //创建一个Person类 class Person {constructor(name) {this.name name;}drink() {console.log(喝水);} } //创建一个Teacher类&#xff0c;继承Person class Teacher extends Person {constructor(name, subject) {super(name);this.subject subjec…

软件测试活动中,如何评估测试范围?

前言 大家好&#xff0c;我是chowley&#xff0c;今天来讲一讲——如何评估软件测试范围 在软件开发的不同阶段&#xff0c;评估测试范围是确保测试活动有效性和效率的关键步骤。测试范围的明确定义有助于确定测试目标、提高测试覆盖率&#xff0c;并确保在有限的时间内实现最…

动手学深度学习8 Softmax回归+损失函数+图片分类

Softmax回归损失函数图片分类 1. Softmax回归--分类问题2. 三个常用损失函数1. 均方损失 L2 Loss2. 绝对值损失函数 L1 Loss3. 两个结合 HUber’s Robust Loss 3. 图片分类数据集4. Softmax回归从零开始实现5. Softmax回归简洁实现6. QA 1. Softmax回归–分类问题 真实y只有一个…

vue项目中路由懒加载的三种方式

1 . vue异步组件技术 异步加载 vue-router配置路由 , 使用vue的异步组件技术 , 可以实现按需加载 . 但是,这种情况下一个组件生成一个js文件 /* vue异步组件技术 */ { path: /home, name: home, component: resolve > require([/components/home],resolve) }, { path…

基于java+jsp+ssh的毕业生就业信息管理系统

&#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩项目推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮…

ShardingSphere之ShardingJDBC客户端分库分表下

目录 ShardingJDBC实战 STANDARD标准分片策略 COMPLEX_INLINE复杂分片策略 CLASS_BASED自定义分片策略 HINT_INLINE强制分片策略 ShardingJDBC实战 上篇已经将需要用到的类、数据库表都准备好了&#xff0c;本篇主要介绍分片配置文件。 STANDARD标准分片策略 如果按照上篇文…

golang版本使用令牌桶算法来实现限流的策略

代码 package mainimport ("fmt""sync""time" )// 令牌桶结构体 type TokenBucket struct {tokens chan struct{}rate time.Duration// 桶容量limit int }// 创建令牌桶 func NewTokenBucket(rate time.Duration, limit int) *TokenBucket {r…

纳斯达克户外大屏背景配什么颜色效果最好-大舍传媒

纳斯达克户外大屏背景配什么颜色效果最好 引言 纳斯达克大屏是世界闻名的户外广告媒体之一&#xff0c;通过高清大屏呈现的广告内容吸引了众多目光。大舍传媒作为纳斯达克大屏的提供商和运营商之一&#xff0c;致力于创造最佳的视觉效果来吸引观众的注意力。在纳斯达克大屏投…

C语言“++”和“--”运算符需要注意些什么?

一、问题 “”和“--”运算符经常被应⽤&#xff0c;使⽤这两种运算符需要注意些什么&#xff1f; 二、解答 在使用C语言中的自增&#xff08;&#xff09;和自减&#xff08;--&#xff09;运算符时&#xff0c;需要注意以下几点&#xff1a; 1、运算规则 运算符有两种形式&…

cs2系统提升思路

思路/战术 > 道具 > 练枪 思路/战术 通用的思路 > 针对性学习每一张图的思路 注意&#xff0c;休闲中人数较多&#xff0c;战术的体现不多&#xff0c;不要休闲打习惯了适应不了竞技 地图理解 / 分析 根据地形分析攻防 &#xff08;比如dust2&#xff0c;所有道路…

HCIA学习作业四

要求&#xff1a; 1、AR3还回为3.3.3.0/24 2、其他基于192.168.1.0/24进行合理划分 3、AR1和AR2均存在两个环回 4、整个网络运行RIP v2 但是不能直接宣告AR3的环回 5、全网可达&#xff0c;保障更新安全&#xff0c;尽量减少路由条目&#xff0c;避免环路 拓扑图&#xf…