gcd以及exgcd入门讲解
gcd就是最大公约数,gcd(x, y)一般用(x, y)表示。与此相对的是lcm,最小公倍数,lcm(x, y)一般用[x, y]表示。
人人都知道:lcm(x, y) = x * y / gcd(x, y)
证明起来也不是很难:
(这真的是我自己写的,因为博客园不支持这格式……)
至于gcd的求法,想必各位在高中都学过辗转相除法和更相减损之术,这里只讲辗转相除法(更相减损之术略慢)
首先不妨设 x ≤ y,则gcd(x, y) =gcd(x, x +y) = gcd(x, y - x).所以gcd(x, y) = gcd(y % x, x),因此可以递归求解。
复杂度证明:因为y % x ≤ x && x ≤ y,所以y % x < y / 2。因此在最坏情况下为O(nlogn)。(用斐波那契数列的相邻两个数可以达到最坏复杂度)
那么接下来讲一下扩展gcd。
exgcd可以用来判断并求解形如ax +by = c 的方程,当且仅当gcd(a, b) | c时,存在整数解x, y。
也就是说,exgcd可以用来求解方程ax +by = gcd(a, b)
令a = b, b = a % b,则有方程b *x1 +(a % b) * y1 = gcd(b, a % b)
又因为gcd(a, b) = gcd(a % b),且a % b = a - b * ⌊a / b⌋
则b * x1 + (a - b * ⌊a / b⌋) * y1 =gcd(a, b)
整理得:a * y1 +b * (x1 - ⌊a / b⌋ *y1) = gcd(a, b)
所以原方程中:x = y1, y = x1 - ⌊a / b⌋ *y1。于是我们只要递归求出x1, y1就能求出x, y。
代码很短
void exgcd(ll a, ll b, ll& x, ll& y, ll& c)
{
if(!b) {y = ; x = ; c = a; return;}
exgcd(b, a % b, y, x); y -= a / b * x;
}
其中c = gcd(a, b)
值得注意的是,递归调用的时候y的位置上传了x,x位置上是y,也就是说,y里存的是x1,x里存的是y1,所以y -= a / b *y1,即y -= a / b * x。
我们现在已经求得了ax +by = gcd(a, b)的解,那么对于方程ax + by = c (gcd(a, b) | c)呢?
因为已经知道a *x1 +b * y1 = gcd(a, b)的解x1, y1,左右两边同乘以c / gcd(a, b) 得:
a * x1 * c / gcd(a, b) +b * y1 * c / gcd(a, b) = c
则原方程的一组解x2 = x1 * c / gcd(a, b), y2 = y1 * c / gcd(a, b)
由此得出解集{(x, y) | x = x2 + k * b / gcd(a, b), y = y2 - k * a / gcd(a, b), k ∈ z}
gcd以及exgcd入门讲解的更多相关文章
- Mysql C语言API编程入门讲解
原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. ...
- #001 CSS快速入门讲解
CSS入门讲解 HTML人+CSS衣服+JS动作=>DHTML CSS: 层叠样式表 CSS2.0 和 CSS3.0 版本,目前学习CSS2, CSS3只是多了一些样式出来而已 CSS 干啥用的 ...
- HTML5游戏开发引擎Pixi.js新手入门讲解
在线演示 本地下载 这篇文章中,介绍HTML5游戏引擎pixi.js的基本使用. 相关代码如下: Javascript 导入类库:(使用极客的cdn服务:http://cdn.gbtags.com) ...
- AngularJS入门讲解4:多视图,事件绑定,$resource服务讲解
上一课,大家知道,手机详细模板我们没有写出来,使用的是一个占位模板. 这一课,我们先实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 为了实现手机详细信息视图,我们将会使用 ...
- 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS
LINK 其实就是三个板子 1.快速幂 快速幂,通过把指数转化成二进制位来优化幂运算,基础知识 2.gcd和exgcd gcd就是所谓的辗转相除法,在这里用取模的形式体现出来 \(gcd(a,b)\) ...
- poj2104 k-th number 主席树入门讲解
poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树 刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...
- gcd与exgcd
gcd 辗转相除法求gcd证明 \(gcd(a, b) == gcd(b, a\%b)\) 证明: 设: \(d\)为\(a\)与\(b\)的一个公约数, 则有\(d|b\) \(d|a\) 设: \ ...
- 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho
数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...
- 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...
随机推荐
- Java基本数据类型总结(转载)
Java基本数据类型总结 基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型.java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量 ...
- Java基础——collection接口
一.Collection接口的定义 public interfaceCollection<E>extends iterable<E> 从接口的定义中可以发现,此接口使用了泛型 ...
- mysql的密码问题
常见问题 Access denied for user 'root'@'localhost' (using password: YES) 因密码不对而拒绝访问,再jdbc配置中 常常忽略user和密码 ...
- 测试单元测试完毕关闭jvm
今天一天都在纠结Netty中的服务器端究竟是如何实现自动关闭的, 吃完晚饭才发现原来不是netty关闭,是测试单元关闭的...
- EF DataFirst修改数据类型
在做软件的时候我们可能会遇到这样的问题,就是在使用EF的时候,有时候精度不一样, 我们用整数来计算肯定是比浮点数来得快的,但我在MySQL里面存储的数据类型是decimal的,我生成EF后, 里面的数 ...
- ubuntu16.04下安装mysql,并开启远程访问
一.安装 apt-get install mysql-server 二.本地连接 mysql默认开启了本地连接 直接通过mysql -uuser -p,然后输入密码访问 三.开启远程访问 3.1.创建 ...
- C 中结构体对齐
参考 百度百科内存对齐 对齐作用 可以使得以最少的次数将操作数加载到寄存器中,如果数据没有对齐,则当CPU以最小读取数据大小从内存读入数据时可能只取到了一部分数据,而对齐情况下可以一次读入. 对齐修改 ...
- 让你彻底搞懂JS中复杂运算符==
让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ...
- html前端学习
html : 1.相当于没有穿衣服的人,一套浏览器认识的规则, 2.开发者: 学习html规则 开发后台程序: -写html文件(充当模板) -数据库获取数据,然后替换到html文件的指定位置(web ...
- 安装php扩展包
sudo apt-get install php5-gd curl libcurl3 libcurl3-dev php5-curl 重启Apache sudo service apache2 rest ...