扩展欧几里得复习篇。
扩展欧几里得复习篇。
由于多校考了欧几里得,所以这里复习一波扩欧。
这里主要讲解利用扩欧求解二元一次方程的整数解问题。
0.求解: a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)。
根据欧几里得知识可知: g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)。
所以有式子:
{ a x + b y = g c d ( a , b ) b x 1 + ( a % b ) y 1 = g c d ( b , a % b ) \begin{cases}ax+by=gcd(a,b)\\bx_1+(a\%b)y_1=gcd(b,a\%b)\end{cases} {ax+by=gcd(a,b)bx1+(a%b)y1=gcd(b,a%b)
即: a x + b y = b x + ( a % b ) y ax+by=bx+(a\%b)y ax+by=bx+(a%b)y.
令: a % b = ( a − ⌊ a b ⌋ × b ) a\%b=(a-\lfloor\dfrac{a}{b}\rfloor\times b) a%b=(a−⌊ba⌋×b)。
则有:
a x + b y = b x 1 + ( a − ⌊ a b ⌋ × b ) y 1 a x + b y = a y 1 + b ( x 1 − ⌊ a b ⌋ y 1 ) ax+by=bx_1+(a-\lfloor\dfrac{a}{b}\rfloor\times b)y_1\\ax+by=ay_1+b(x_1-\lfloor\dfrac{a}{b}\rfloor y_1) ax+by=bx1+(a−⌊ba⌋×b)y1ax+by=ay1+b(x1−⌊ba⌋y1)
即 x = y 1 , y = ( x 1 − ⌊ a b ⌋ y 1 ) x=y_1,y=(x_1-\lfloor\dfrac{a}{b}\rfloor y_1) x=y1,y=(x1−⌊ba⌋y1)
显然我们只要知道了 x 1 , y 1 , a , b x_1,y_1,a,b x1,y1,a,b就能求出 x , y x,y x,y。因此不断往下递归。
因为我们知道 g c d ( a , b ) gcd(a,b) gcd(a,b)最终会递归到 b = 0 b=0 b=0的时候,这是 g c d = a gcd=a gcd=a。
所以对应 a x k + b y k = g c d = a , b = 0 → x k = 1 , y k = 0 ax_k+by_k=gcd=a,b=0\rightarrow x_k=1,y_k=0 axk+byk=gcd=a,b=0→xk=1,yk=0.
求出最底层的 x k , y k x_k,y_k xk,yk后,我们就可以不断回溯,求出 x , y x,y x,y了。
我们知道特解就可以求出通解了.
令 g = g c d ( a , b ) , c = b g , d = a g g=gcd(a,b),c=\dfrac{b}{g},d=\dfrac{a}{g} g=gcd(a,b),c=gb,d=ga
有 a c t = b d t = a b t g act=bdt=\dfrac{abt}{g} act=bdt=gabt, t ∈ N t\in N t∈N.
则通解 { x = x 0 + c t y = y 0 − d t \begin{cases}x=x_0+ct\\y=y_0-dt\end{cases} {x=x0+cty=y0−dt
因为 a ( x 0 + c t ) + b ( y 0 − d t ) = a x 0 + b y 0 + ( a c t − b d t ) = a x 0 + b y 0 = g c d ( a , b ) a(x_0+ct)+b(y_0-dt)=ax_0+by_0+(act-bdt)=ax_0+by_0=gcd(a,b) a(x0+ct)+b(y0−dt)=ax0+by0+(act−bdt)=ax0+by0=gcd(a,b)
1.求解: a x + b y = z ax+by=z ax+by=z。
对应的:若 a x + b y = z ax+by=z ax+by=z有整数解,则 g c d ( a , b ) ∣ z gcd(a,b)|z gcd(a,b)∣z,即 g c d ( a , b ) gcd(a,b) gcd(a,b)能整除 z z z。
因此要求解 a x + b y = z ax+by=z ax+by=z。
我们可以先求出 a x 1 + b y 1 = g c d ( a , b ) ax_1+by_1=gcd(a,b) ax1+by1=gcd(a,b)的解 x 1 , y 1 x_1,y_1 x1,y1。
令 t = z g c d ( a , b ) t=\dfrac{z}{gcd(a,b)} t=gcd(a,b)z。
则 ( a x 1 + b y 1 ) × t = z → a ( t x 1 ) + b ( t y 1 ) = z (ax_1+by_1)\times t=z\rightarrow a(tx_1)+b(ty_1)=z (ax1+by1)×t=z→a(tx1)+b(ty1)=z.
即 x = t x 1 , y = t y 1 x=tx_1,y=ty_1 x=tx1,y=ty1。
因此该方程对应的特解我们就求出来,同理特解我们也能求出来。
2.求解: a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的最小非负整数解。
因为我们可以得到通解 { x = x 0 + c t y = y 0 − d t \begin{cases}x=x_0+ct\\y=y_0-dt\end{cases} {x=x0+cty=y0−dt
所以我们只需要取适当的 t t t就可以使 x x x为非负数。
具体地:
i f ( x < 0 ) x = ( x 0 % c + c ) % c if(x<0)\ x=(x_0\%c+c)\%c if(x<0) x=(x0%c+c)%c,这里用取模就很容易实现。
然后我们判断一下 y y y是否为非负整数即可: y = ( g c d − a x ) b y=\dfrac{(gcd-ax)}{b} y=b(gcd−ax).
3.具体实现的代码(两种写法).
void exgcd(int a,int b,int &x,int &y){if(!b){x=1,y=0;return;}exgcd(b,a%b,x,y);int tmp=x;x=y;y=tmp-(a/b)*y;
}
/
void exgcd(int a,int b,int &x,int &y){if(!b){x=1,y=0;return;}exgcd(b,a%b,y,x); //这里仔细体会一下,这里我们将x1赋给y,y1赋给x y-=(a/b)*x;
}
扩展欧几里得复习篇。相关推荐
- 欧几里得+扩展欧几里得+RSA
欧几里得算法: 就是辗转相除法,gcd(a,b)=gcd(b,a%b), 实现简单,用途广泛,模板如下: int gcd(int a,int b)//或者都取 long long {return b! ...
- 扩展欧几里得的应用(超详细求逆元求解方程)
扩展欧几里得算法: 1.扩展欧几里得算法可以求逆元 2.扩展欧几里得算法可以求类似 ax+by=m, 的所有整数解,当m%gcd(a,b)==0 则ax+by=m有无线多个解,否则无解 扩展欧几里得的 ...
- 欧几里得原理及扩展欧几里得原理(Euclidean Theory and Extended Euclidean Theory)学习笔记
题记:这是我第四次复习扩展欧几里得原理,因为不常用到,想要使用的时候又想不起细节,总是要查资料,于是索性这次整理一下欧几里得原理及其扩展原理存档至博客以备查用. 一.欧几里得原理 欧几里得原理(Euc ...
- 扩展欧几里得 POJ 1061
感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...
- 求逆元(线性求逆元)及其扩展欧几里得
线性求逆元模板: int inv[maxn]; void initInverse(){inv[1] = 1;for(int i = 2; i <= maxn; i++)inv[i] = (p - ...
- poj-青蛙的约会(扩展欧几里得)nyoj-小柯的约会
由题意可列出方程 x + m * s - (y + n * s) = k * l; 化简得 (n-m)*s + k*l = x - y 化简得 (n-m)*s = x - y (mod l); ...
- [模板]欧几里得算法/扩展欧几里得
最大公因数(欧几里得算法) $gcd(a,b)=gcd(b\%a,a)$(不一定需要a<b) $gcd(0,b)=b$ 1 inline int gcd(int a,int b){ 2 retu ...
- “景驰科技杯”2018年华南理工大学程序设计竞赛 H-对称与反对称(扩展欧几里得求逆元)
题目链接 题目描述: 给出一个N*N的方阵A.构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反对称矩阵. 对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩阵 对 ...
- Strange Optimization(扩展欧几里得)
Strange Optimization Accepted : 67 Submit : 289 Time Limit : 1000 MS Memory Limit : 65536 KB Str ...
最新文章
- Go语言调度器之调度main goroutine(14)
- 架构师速成8.3-架构师必须要了解的规则(转)
- python turtle画圆、循环法_实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)...
- 个人计算机与微型计算机的区别与联系,微处理器、微型计算机和微型计算机系统之间有何联系与区别?...
- 计算机技术可以学音乐吗,音响工程师可以练出来吗?
- 化工热力学重修补考第三章重点内容
- 添加 Bash 自定义命令
- java 调用一个抛出异常的函数,Java VS C++(14) 调用可能抛出异常的函数
- jzoj3236-矮人排队【权值线段树】
- DFS应用——查找强分支
- Hibernate事实:始终检查Criteria API SQL查询
- Linux(debian7)操作基础(十二)之文件加密使用指南
- 浏览器根对象document之字符串属性
- #9 shell脚本的函数运用
- pycharm 没有 python template languages_开发效率神器说说Pycharm的骚操作
- android listview去掉分割线
- Tier2 上1K Node的准备
- 用计算机技术辅助语文教学,利用计算机技术辅助拼音学习“潜力无限”
- springboot Could not resolve placeholder
- 某网店营销策划方案(SWOT部分)