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 ...
随机推荐
- 【4】 .net MVC使用Session验证用户登录
用最简单的Session方式记录用户登录状态 1.添加DefaultController控制器,重写OnActionExecuting方法,每次访问控制器前触发 public class Defaul ...
- [javaSE] 集合框架(体系概述)
为什么出现集合类 为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式 数组和集合的不同 数组是固定长度的,集合是可变长度的 数组可以存储基本数据类型,集合只能存储对象 数组只能 ...
- HDFS 操作命令总结
1 hadoop fs 这个是FS shell 提供的 .上传下载文件 查看文件大小 改变文件权限都用这个命令. 具体命令的 用法可以到这个文档来查询 http://hadoop.apache ...
- effective VBA
For Append As: Open "1.txt" For Append As #1Open "1.txt"就是打开名为1.txt的文件For Append ...
- 测试单元测试完毕关闭jvm
今天一天都在纠结Netty中的服务器端究竟是如何实现自动关闭的, 吃完晚饭才发现原来不是netty关闭,是测试单元关闭的...
- Mysql添加字段.md
alter table td_user add gender bit DEFAULT 0 COMMENT '性别';
- Eclipse自动编码提示设置
1.window->Preferences->Java->Editor->content assist 输入 .abcdefghijklmnopqrstuvwxyz,然后 OK ...
- Date类型错误
今天写代码的时候遇到一个很蛋疼的问题,明明实体类写的是Date型,文本框也是date型,数据库中对应的列是dateTime类型,这原本进行数据录入或者是修改这个操作是不应该出错的,但是一时没找到解决的 ...
- vertical-align 详解
vertical-align用来设置垂直对齐方式,所有垂直对齐的元素都会影响行高 值: baseline | sub | super | top | text-top | middle | botto ...
- 将数据导入MongoDB集群与MySQL
import sys import json import pymongo import datetime from pymongo import MongoClient client = Mongo ...