定义

扩展欧几里得算法是用来在已知一组 \((a,b)\) 的时,求解一组 \((x,y)\) 使得

\[ax+by=gcd(a,b)
\]

思想 and 板子

根据相关的知识可以得到

\[gcd(a,b)=gcd(b,a \bmod \ b)
\]

由当 \(b=0\) 是即可得出 \(x=1,y=0\)

即可递推求解

如何来做?

\[ax+by=gcd(a,b)=gcd(b,a \bmod b)
\]
\[bx+(a \bmod\ b)y=gcd(b,a \bmod b)
\]
\[bx+(a-\lfloor\frac{a}{b}\rfloor\times b)\times y=gcd(b,a\bmod b)
\]
\[bx+ay-\lfloor\frac{a}{b}\rfloor\times by=gcd(b,a\bmod b)
\]
\[ay+b(x-\lfloor\frac{a}{b}\rfloor\times y)=gcd(b,a\bmod b)
\]

进而可以得出结论

\[ax+by
\]
\[\to ay+b(x-\lfloor\frac{a}{b}\rfloor\times y)
\]

有了结论就可以实现简单的求解

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

为什么要用?

在当前我的理解范围内,它既可以求出最大公约数,并且求出来的 \(x,y\) 可以进行解决一些问题

应用

可用于进行对二元一次不定方程的求解

\[ax+by=c
\]

根据裴蜀定理可得,这个方程有整数解的充要条件为

\[c \ \bmod\ gcd(a,b)=0
\]

同样,该方程可以等同于

\[ax \equiv c\ (\bmod b)
\]

P5656 板子可以为较为拓展的应用

1、如何来求 \(ax+by=c\) 的一个解

首先我们在有整数解的情况下求出

\[ax+by=gcd(a,b)
\]

的解 \((x_0,y_0)\)

由\(k=\frac{c}{gcd(a,b)}\)

得出来

该方程的一个解可以为

\(\begin{cases}
x=kx_0\\y=ky_0
\end{cases}\)

也就是方程在同除完 \(k\) 后求出解来,进而乘上 \(k\) 得出当前的解,因为\(a,b\)是不变的

2、如何根据一组解求出多组解来

首先任意选择一个数\(t\),为了方便叙述和计算,一般设\(t=1\)

设两个整数 \(m,n\)

我们可以得出

\[a(x+m)+b(y+n)=c
\]
\[ax+am+by+bn=c
\]

\[ax+by=c
\]

可知

\[am+bn=0
\]

那么就是寻找一组 \((m,n)\)使得该方程 成立即可

可以得到

\(\begin{cases}
m=\frac{b}{gcd(a,b)}\\n=-\frac{a}{gcd(a,b)}
\end{cases}\)

代进去等式成立,进而就可以得到一组解

\(\begin{cases}
x_i=x+m\\y_i=y+n
\end{cases}\)

3、考虑正整数解的最大值最小值,及其正整数解的个数

首先设置一下变量

\(\begin{cases}
d=gcd(a,b)\\tx=\frac{b}{d}
\\ty=\frac{a}{d}
\end{cases}\)

首先那我们从x的最小值开始找起

可以得到式子

\[x+k\times tx\ge 1
\]
\[k\ge \lceil\frac{1-x}{tx}\rceil
\]

得到\(x_{min}=x+\lceil\frac{1-x}{tx}\rceil\times tx\)

那么此时同样可以得到 \(y_{max}=y-\lceil\frac{1-x}{tx}\rceil\times ty\)

  • 如果此时没有\(y_{max}\)不是正整数的话

那么就在求一下

\[y_{max}+k\times ty\ge1
\]
\[k\ge \lceil\frac{1-y_{max}}{ty}\rceil
\]

那么 \(y\) 的最小正整数解即为 \(y_{max}+\lceil\frac{1-y_{max}}{ty}\rceil\times ty\)

同样适用于有正整数解情况下的\(y_{min}\)

  • 如果此时有正整数解

可以很显然的发现\(y_{min}=y_{max}\bmod ty\)

利用情况一中的结论可以求出

\[x_{max}=x_{min}-\lceil\frac{1-y_{max}}{ty}\rceil\times tx
\]

至于解的个数可以参考在\(y_{max}\to y_{min}\)过程中 $ k $的变化

正整数解的组数即为 \(\lfloor\frac{y_{max}-1}{ty}\rfloor+1\)

代码请参考P5656

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#define int long long
using namespace std;
int x,y;//用于求解
int read()//不到卡常不用快读=_=
{
char c=getchar();
int f=1;
int x=0;
while(c<'0'||c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
int exgcd(int a,int b)
{
if(!b)
{
x=1;
y=0;
return a;
}
int ans=exgcd(b,a%b);
int tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}
signed main()
{
int t;
t=read();
while(t--)
{
int a,b,c;
a=read();
b=read();
c=read();
int d=exgcd(a,b);
if(c%d!=0)//根据裴蜀定理得出,c不是gcd(a,b)的倍数,则一定无整数解
{
cout<<-1<<endl;
continue;
}
x=x*c/d;
y=y*c/d;//求出一组正整数解
int tx=b/d;
int ty=a/d;
int k=ceil((1.0-x)/tx);//求出x_min正整数;判\断y是否为正整数
x+=k*tx;//x_min
y-=k*ty;//求出此时的ymax
if(y<=0)
{
int ymin=y+ty*ceil((1.0-y)/ty)*1ll;
printf("%lld %lld\n",x,ymin);
}
else
{
printf("%lld ",(y-1)/ty+1);//个数
printf("%lld ",x);//最小值
printf("%lld ",(y-1)%ty+1);//最小值
printf("%lld ",x+((y-1)/ty*tx));//max
printf("%lld \n",y);//max
}
continue;
}
return 0;
}

扩展欧几里得(exgcd)及其应用的更多相关文章

  1. 同余问题(一)——扩展欧几里得exgcd

    前言 扩展欧几里得算法是一个很好的解决同余问题的算法,非常实用. 欧几里得算法 简介 欧几里得算法,又称辗转相除法. 主要用途 求最大公因数\(gcd\). 公式 \(gcd(a,b)=gcd(b,a ...

  2. 浅谈扩展欧几里得[exgcd] By cellur925

    关于扩展欧几里得从寒假时就很迷,抄题解过了同余方程,但是原理并不理解. 今天终于把坑填上了qwq. 由于本人太菜,不会用markdown,所以这篇总结是手写的(什么).(字丑不要嫌弃嘛) ****** ...

  3. 扩展欧几里得(exgcd)与同余详解

    exgcd入门以及同余基础 gcd,欧几里得的智慧结晶,信息竞赛的重要算法,数论的...(编不下去了 讲exgcd之前,我们先普及一下同余的性质: 若,那么 若,,且p1,p2互质, 有了这三个式子, ...

  4. 扩展欧几里得(exgcd)-求解不定方程/求逆元

    贝祖定理:即如果a.b是整数,那么一定存在整数x.y使得ax+by=gcd(a,b).换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍.(可以来判断一个这样的式子有没有解)有一个 ...

  5. 扩展欧几里得 exGCD

    Elementary Number Theory - Extended Euclid Algorithm Time Limit : 1 sec, Memory Limit : 65536 KB Jap ...

  6. 数论--扩展欧几里得exgcd

    算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...

  7. EXGCD 扩展欧几里得

    推荐:https://www.zybuluo.com/samzhang/note/541890 扩展欧几里得,就是求出来ax+by=gcd(x,y)的x,y 为什么有解? 根据裴蜀定理,存在u,v使得 ...

  8. exgcd扩展欧几里得求解的个数

    知识储备 扩展欧几里得定理 欧几里得定理 (未掌握的话请移步[扩展欧几里得]) 正题 设存在ax+by=gcd(a,b),求x,y.我们已经知道了用扩欧求解的方法是递归,终止条件是x==1,y==0: ...

  9. UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

    题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...

  10. UVA 10090 Marbles 扩展欧几里得

    来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...

随机推荐

  1. mysql 提示 vcruntime140_1.dll丢失

    百度网盘:https://pan.baidu.com/s/1vbVexHs1eRfGlnTbr8U53Q 提取码:59tm 将两个文件同时放到路径:C:\Windows\System32 下,运行ba ...

  2. Arduino IDE 开发ESP-01/ESP8266-01读取DHT11温度湿度传感器

    引脚接线: DHT11---ESP8266-01 Singnal--IO2, GND----GND, VCC----VCC DHT11引脚说明: ESP8266-01/ESP8266-01S引脚说明: ...

  3. SpringBoot全局异常拦截

    SpringBoot全局异常捕获 使用到的技能 @RestControllerAdvice或(@ControllerAdvice+@ResponseBody) @ExceptionHandler 代码 ...

  4. js相关语法知识

    alert(); 页面弹窗 <input plactholder="请输入密码"/>(隐藏字体效果)js对数据类型不敏感,与Java相似1.js变量定义符:var2.j ...

  5. 什么是Service Mesh

    摘自https://zhuanlan.zhihu.com/p/61901608 Service Mesh作为下一代微服务技术的代名词,初出茅庐却深得人心一鸣惊人,大有一统微服务时代的趋势. 那么到底什 ...

  6. 技术基础 | 监测Apache Cassandra的简明方式——MCAC

    点击这里在GitHub上访问我们,以便深入了解DataStax的开源项目--Apache Cassandra指标收集器(Metric Collector for Apache Cassandra, o ...

  7. springboot项目父依赖管理

    springboot项目,pom文件中,要引用父pom文件,进而使用其依赖关系 例如: <parent> <groupId>org.springframework.boot&l ...

  8. SpringCloud --服务调用Feign

    介绍 服务间通信简介 一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务.商品服务.用户服务等共同组成. 这些服务相互独立,但又相互依赖.由于它们相互依赖,所以需要通过通信的方式来进行相互 ...

  9. CentOS7 普通用户绕过root登录

      正常环境中我们的服务器都会使用一个普通用户跳转到root进行操作,如果root用户的密码不记得只知道普通用户密码,设备又不方便进行开关机破密码时,我们就可以用到以下方法登陆设备. pkexec : ...

  10. 基于nginx实现web服务器的双机热备

    1.适用场景 对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务.当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务.双机热 ...