exgcd 重修

Exgcd(拓展欧几里得算法)的初步理解 若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.针对于一次不定方程ax+by=c进行求解,利用以上的裴蜀定理可以进行求解,当然要满足 gcd(a,b)|c 这个前置情况这个时候实际上就是对于b*x+(a%b)*y=d(辗转相除法求得)a%b=a-(a/b)*b进行带入即可得到:a*y-b*(x-(a/b)*y)=d和原式ax+by=d对 阅读详情

kino好强啊orz
突然发现连青蛙的约会都没过
怎么办 威严尽失(似乎从未存在)
重修好了!
新年版的优快云emmmmm


exgcd的数学推导

真是受不了最近的优快云了。。数学公式怎么可以那么丑!!!
先证gcd的性质,即gcd(a,b)=gcd(b,a mod b)gcd(a,b)=gcd(b,a mod b)
该性质证明的话。。就从定义乱搞搞吧
定义mm是最大公因数
a=k1⋅m,b=k2⋅m,
a mod b=a−b⋅⌊k1k2⌋=m(k1−k2⌊k1k2⌋)a mod b=a−b⋅⌊k1k2⌋=m(k1−k2⌊k1k2⌋)
∴a≡b≡(a mod b)(modm)∴a≡b≡(a mod b)(modm)
那什么时候a mod b=0a mod b=0呢?此时有k1−k2⌊k1k2⌋=0⇒k1k2=⌊k1k2⌋k1−k2⌊k1k2⌋=0⇒k1k2=⌊k1k2⌋
也就是k1k1是k2k2的整倍数。这意味着什么?由于mm已经是最大公因数,我们不可能找出来一个比m更大的公因数了,此时的k2k2只能是1。那么,bb本身等于m,所以我们有这样一行的求gcd:

inline int gcd(int x, int y){
    return y ? gcd(y, x % y) : x;
}

好了,现在我们可以来证exgcd了。
exgcd解决的是,对于方程ax+by=gcd(a,b)ax+by=gcd(a,b)找一组整数解。那怎么搞?
回溯一下gcd的过程。我们知道,对于求解gcd的过程最后一步一定是求解gcd(m,0)gcd(m,0)。关注gcd的定义,gcd(m,0)=m=1×m+0×0gcd(m,0)=m=1×m+0×0
所以说在这个方程最后一步求解的过程中,我们总能找到对应的1和0满足一个解。那么其它情况呢?
假定ax+by=gcd(b,a mod b)ax+by=gcd(b,a mod b),如果该方程解为x′,y′x′,y′则ax′+(a mod b)y′=gcd(b,a mod b)ax′+(a mod b)y′=gcd(b,a mod b)
⇒bx′+(a−b⋅⌊ab⌋)y′=gcd(b,a mod b)⇒bx′+(a−b⋅⌊ab⌋)y′=gcd(b,a mod b)
⇒ay′−b(x′−⌊ab⌋y′)=gcd(b,a mod b)=gcd(a,b)⇒ay′−b(x′−⌊ab⌋y′)=gcd(b,a mod b)=gcd(a,b)
所以,总能找到y=x′,x=x′−⌊ab⌋y′y=x′,x=x′−⌊ab⌋y′使得方程ax+by=gcd(a,b)ax+by=gcd(a,b)有解。运用归纳法,可以得到如下定理:

对于任意整数a,ba,b,∃x,y∃x,y,满足ax+by=gcd(a,b)ax+by=gcd(a,b)

事实上,刚刚进行的过程就是exgcd的运行过程。

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

上述过程中我们以引用传递x,yx,y,得到的结果就是一组特解。其执行过程是,如果达到最后一步就返回当前的特解1,01,0,然后逐步回溯。程序最后的返回值是gcd(a,b)gcd(a,b)。
好了,我们来看方程ax+by=cax+by=c,假定gcd(a,b)=dgcd(a,b)=d,则方程有解的条件是c mod d=0c mod d=0,特解是cdx0cdx0和cdy0cdy0

通解则是x=cdx0+k⋅bdx=cdx0+k⋅bd,y=cdy0−k⋅ad(k∈Z)y=cdy0−k⋅ad(k∈Z)
于是乎。。搞完了。
令t=bdt=bd,则最小正整数解显然应当是((x mod t)+t) mod t((x mod t)+t) mod t,因为这样解下来的x可能是负数。

然后就可以搞事情喽。


luogu1516 青蛙的约会

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。

用小学奥数知识可以知道,如果跳了t步之后绕了q圈相遇,则:
X+mt−Y−nt=L∗qX+mt−Y−nt=L∗q
从而(m−n)t+L∗(−q)=Y−X(m−n)t+L∗(−q)=Y−X,对其exgcd即可。
注意细节极多,不要写错。。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define LL long long
LL m, n, t, L, q, X, Y;
inline int exgcd(LL a, LL b, LL &x, LL &y) {
    if(!b) {x = 1, y = 0; return a;}
    int d = exgcd(b, a % b, x, y);
    int f = x; x = y; y = f - y * (a / b);
    return d;
}
int main() {
    scanf("%d%d%d%d%d", &X, &Y, &m, &n, &L);
    if(m < n) swap(m, n), swap(X, Y);
    LL d = exgcd(m - n, L, t, q);
    if((LL)abs(Y - X) % d != 0) return puts("Impossible"), 0;
    t *= (Y - X) / d;
    LL M = L / d;
    t = (t % M + M) % M;
    printf("%d\n", t);
    return 0; 
} 

luogu1082 同余方程

求方程 ax≡1(modb)ax≡1(modb)的最小正整数解。

玄学分析一波。该方程等价于求解ax−by=1ax−by=1,换言之就是ax+b×(−y)=1ax+b×(−y)=1。
所以其有解的条件是a,b互质。

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define LL long long 

LL a, b, x, y;

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

int main() {
    scanf("%d%d", &a, &b);
    exgcd(a, b, x, y);
    x = (x % b + b) % b;
    printf("%d\n", x);
    return 0;
}

luogu绿了真伤心。。

扩展欧几里得算法(exgcd) 什么是扩展欧几里得算法? exgcd适用于处理一次不定方程的一个算法,可以求出不定方程的一组特解 例如可以用于求解:ax+by=k。给定a,b,k的值,便可以求出一组x,y的解 算法的实现 在exgcd中,我们实际是求不定方程ax+by=gcd(a,b),并且,我们所返回的值,是这组解(x,y)的最大公因数(gcd(x,y))。 所以我们最后得到的解,要通过X=x∗k/gcd(a,b),Y=(k−a∗x)/gcd(a,b)来进行一个小小的转换,得到一组解 下面对算法实现过程给出一个证明 我们通过递归,就可 阅读详情

相关推荐

【数学】扩展欧几里得算法

EXGCD\rm EXGCDEXGCD,即 扩展欧几里得算法,简称 扩欧,是用来求出方程 ax+by=gcd⁡(a,b)ax+by=\gcd(a,b)ax+by=gcd(a,b) 的整数解的,其中 a,ba,ba,b 均为整数. 前置芝士:辗转相除法 与 裴蜀定理。 我们考虑辗转相除法的最后一步,当 b=0b=0b=0 时,要使得 ax+0y=gcd⁡(a,0)=aax+0y=\gcd(a,0)=aax+0y=gcd(a,0)=a 成立,那么只要取 x=1x=1x=1,yyy 取任意整数即可,不妨取 y=0

mango09の世界 2633

扩展欧几里得算法的使用及简单证明

扩展欧几里得算法(ExGcd)是基于传统欧几里得算法的实现,主要用于计算不定方程axbygcdabab∈Z的一组特殊整数解。类似于传统的欧几里得算法计算gcdab时将gcdab转化为gcdbamodb,扩展欧几里得算法通过类似的系数辗转相除法求出xy的一组解。如果我们不使用扩展欧几里得算法计算axbygcdabaxbygcdab移项,得axgcdab−by系数化为1,得xagcd。

peterJr的博客 2370

扩展欧几里得算法(exgcd)从入门到实战:原理、推导与代码实现

本文深入解析扩展欧几里得算法(exgcd)的原理与应用,从基础的gcd算法自然延伸到exgcd的递归推导与代码实现。通过裴蜀定理验证解的存在性,并详细展示如何利用exgcd求解二元一次不定方程、乘法逆元和线性同余方程。文章还提供了递归与迭代双版本的Python实现,以及在实际工程中的应用场景和常见坑点,帮助读者全面掌握这一重要算法。

weixin_29053073的博客 236

gcd与exgcd(裴蜀定理)

gcd(欧几里得算法)与最大公因数 公式:gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b))) 证明: 设a&gt;ba&gt;ba>b,证明a,ba,ba,b的公因数和b,a−bb,a-bb,a−b的公因数是同样的一堆数 首先,有结论:若 x∣a,x∣b,那么x∣(a−b)x|a,x|b,那么x|(a-b)x∣a...

wichiene 1158

exgcd的讲解和推导

这是对于exgcd的讲解和推导。一步一步得推出结论,以及有具体实现的代码。可以使读者理解exgcd。

手把手带你搭建一个语音对话机器人:5分钟定制个人AI小助手

通过本文的简单步骤,你已经掌握了如何用 Python 搭建一个语音对话机器人。我们使用了实现语音识别,利用 OpenAI API 生成对话内容,并通过gTTS将文本转换为语音。整个流程非常简洁,你可以根据自己的需求进一步扩展机器人功能,甚至将其集成到实际的应用场景中。

小蜗牛的珍贵百宝箱 4805

exgcd的模板以及应用

exgcd的变形,由题意我们可以得出x+km≡y+kn(mod l),那么x+km与y+kn跟l成倍数关系,x+km−(y+kn)=lz,z∈Z,变换一下可以得出x-y-k(n-m)= lz,我们令a=n-m,b=l,c=x-y,那么ka+bz=c,形如ax+by=c,令gcd(a,b)=d,通过exgcd我们可以得出ax1+by1=d,方程两边同时乘以c/d,可以得出a。先套用exgcd模板求出最小的特解x,然后用裴蜀定理判断无解的情况,剩下的就是二元一次方程的解法(纯数学,本蒟蒻不会,可以参考。

wh233z的博客 1527

4 轴穿越机 Mark5 机架全解析:从历史演进到电机桨叶选型指南

本文围绕 4 轴穿越机 Mark5 机架展开,先介绍其发展历程(2018 年初代到 2023 年五代,迭代优化轻量化、刚性与兼容性),再明确其核心参数(轴距 220mm、兼容 4-6 寸桨等)对电机桨叶的约束。 详解电机(KV 值、尺寸、推力等)与桨叶(尺寸、螺距、材质等)选型要点及匹配原则(高 KV 配小桨、低 KV 配大桨),给出推重比、功率等理论计算公式,结合新手练习、花飞、竞速、航拍等场景提供具体选型案例,最后提及安全、成本、法规等注意事项,为爱好者提供全面选型参考。

bother3000的博客 1899

线性不定方程,扩展欧几里得算法(Exgcd)

详解线性不定方程,扩展欧几里得算法。

wanglianda2007的博客 713

飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案

本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。

bean的博客 258

图像识别火灾检测系统实战:从火焰特征到YOLO部署全解析

计算机视觉技术正深入改变传统消防的感知方式。图像识别火灾检测利用摄像头采集的视频流,通过颜色、动态和形态特征分析,实现早期火情的自动发现与定位。其核心原理在于,火焰在视觉上具有独特的颜色分布、闪烁特性和轮廓变化,借助目标检测模型如YOLO,可在复杂场景中区分真实火焰与干扰物。这项技术广泛应用于仓库、园区、隧道等大空间场所,是智慧消防的重要支撑。本文从火焰视觉特征、数据集构建、模型选型与系统架构设计出发,结合部署实践中的误报与算力优化经验,为开发者提供一套可落地的视频火焰检测方案。

weixin_42533751的博客 244

关于exgcd及其通解

欧几里得算法: 两个数x和y的最大公约数gcd(x,y)=gcd(y,x%y).这个就不解释了。 关于Exgcd: 用法: exgcd用于求解不定方程ax+by=c的一组解。准确的说,它是用来求解ax+by=gcd(a,b),的x和y。 求解过程: 采用递归方式,我们对a,b不断的求解gcd过程,并从中推出x和y. 我们假设有ax+by=gcd(a,b). 令a=b,b=a%b,则...

qq_41779251的博客 5860

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

【算法学习笔记】35:扩展欧几里得算法(EXGCD)求解线性同余方程

线程同余方程问题是指ax≡bmodm,给定ab和m,找到一个整数x使得该方程成立,即使得axmodmb,随便返回任何一个解都可以。例如4x≡3mod5,那么x的一个可能的解可以是2。接下来用扩展欧几里得算法尝试构造这个解。从ax≡bmodm可知,一定存在一个ya⋅xm⋅yb也就是说,因为ax模m的余数是b,所以ax一定可以表示成m的整数y倍再加上一个b。ax−myb令。

大桔骑士的学习笔记 1453

ComfyUI安装包运行前准备:增加虚拟内存

在Windows系统中,虚拟内存是一种重要的系统资源管理机制,它主要通过将硬盘空间用作内存来扩展系统的可用内存容量。以下是虚拟内存的主要作用: 1. 扩展物理内存容量 当物理内存(RAM)不足时,系统会将一部分数据从内存转移到硬盘上的虚拟内存区域(也称为“分页文件”或“交换文件”)。这样可以为正在运行的程序提供额外的“内存空间”,确保系统能够继续运行,而不会因为内存不足而崩溃。 2. 提高系统稳定性 虚拟内存为系统提供了一个缓冲区。如果没有虚拟内存...

聚梦小课堂 1万+

python爬取《你好, 李焕英》豆瓣评论数据

# 导入工具包 import requests from bs4 import BeautifulSoup import time import pandas as pd import numpy as np # 请求头 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'} # =

python技巧分享 3456

算法之美 - 如何清晰理解扩展欧几里得(exgcd)

今天搞明白了 exgcdexgcd exgcd 的思路,于是来发一篇博客,记录我的思路,也供大家参考。 前提:理解辗转相除法。 本文包含5个部分: 一. exgcdexgcd exgcd 的作用 二. exgcdexgcd exgcd 的求解思路 三. 关键步骤推导 四. 举例说明 五. C++代码实现 你可以选取感兴趣的部分进行月阅读。 注: 本文所用除法 ” ...

涟漪Nodes 921

Harmony:C# 动态代码补丁的5大秘密武器

Harmony 是一个开源库,它允许你在运行时修改托管代码(即使用 .NET 或 Mono 编译的语言编写的应用程序)。它通过利用 AOP(面向切面编程)的思想,可以在不重新编译代码的情况下添加、替换或修改方法的行为。这对于游戏模组(Modding)、插件开发以及调试工具非常有用。安装 Harmony要使用 Harmony,你需要首先安装它。Harmony 作为一个 NuGet 包,可以直接通过 Visual Studio 的 NuGet 包管理器进行安装。安装步骤打开 Visual Studio。

java专栏 1191

exgcd

exgcd即扩展欧几里得算法,用来解决形如axbygcdabab为常数) 的方程的一组整数解。

2201_75771132的博客 1354

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

扩展欧几里得算法【Exgcd】的内容与题目应用

学习exgcd算法,算法模板,模板题和练习题

2401_88501775的博客 906

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

关于exgcd算法(扩展欧几里德算法)的几点总结

EXGCD算法的概念: 一种用来求解形如的同余方程的算法 EXGCD算法的时间复杂度: 求解的时间复杂度大约为 EXGCD算法的代码: #include &lt;cstdio&gt; #include &lt;iostream&gt; using namespace std; int a,b,x,y; void exgcd(int a,int b){ if(b==0){ ...

Object_的博客 1156

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

gcd+exgcd(扩展欧几里得)

gcd+exgcd算法讲解与模板

Mango. 229

【exgcd】不定方程整数通解

设{ax1​+by1​=gcd⁡(a,b)bx2​+(amodb)y2​=gcd⁡(b,amodb)​gcd⁡(a,b)=gcd⁡(b,amodb)所以ax1​+by1​=bx2​+(amodb)y2​又因为amodb=a−(⌊ba​⌋×b)所以有ax1​。

群山中的菜鸡 939
上一篇: lyd读书笔记 0x01位运算
下一篇: lyd读书笔记 0x02 枚举、模拟、递推
LittleRewriter
博客等级 码龄9年 35粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值