拓展欧几里得算法
来源:互联网 发布:微信 打开淘宝客户端 编辑:程序博客网 时间:2024/06/05 19:20
首先你要知道欧几里得算法(就是辗转相除法)
Gcd(a,b)=gcd(b,a%b)
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;}
那么来看拓展欧几里得算法
先上代码
Gcd(a,b)=ax+by 这是一个不定方程,扩欧用来求x,y的整数解
void exgcd(int a,int b,LL &x,LL &y){
if(b==0){x=1,y=0;return;}
exgcd(b,a%b,x,y);
LL t=x; x=y,y=t-a/b*y;
}
那么为什么会这样呢
让我们来证明一下:
我们想求一组(x,y)使得gcd(a,b)=ax+by
根据b≠0 -->gcd(a,b)=gcd(b,a%b)
如果我们现在有x’,y’,那么gcd(b,a%b)=b*x'+(a%b)*y'
那么我们现在可以令 ax+by=b*x'+(a%b)*y' ①式
注意到a%b=a-a/b*b
带入①式得:ax+by=b*x'+(a-a/b*b)*y' ②式
注意它的每一项仅仅是由a,b相关的
改造
右边也以a,b为元 ax+by=a*y'+b*(x'-a/b*y')
得出一组特解:x=y' y=x'-a/b*y'
它这个递归的基为b=0
当b=0时,ax+by=gcd(a,b) 可以得出x=1,y=0;
证毕。。
证明结束了
如果还想看看题目的话可以看看noip 2012 D2T1
阅读全文
0 0
- 欧几里得算法+拓展欧几里得算法
- 欧几里得算法&&拓展欧几里得算法
- 欧几里得算法&&拓展欧几里得算法
- 欧几里得与其拓展算法
- 拓展的欧几里得算法
- 拓展欧几里得算法
- 拓展欧几里得算法
- 拓展欧几里得算法模板
- 拓展的欧几里得算法
- 拓展欧几里得算法
- 拓展欧几里得算法
- 欧几里得拓展算法求模逆元
- 欧几里得算法及其拓展
- 拓展欧几里得算法
- 欧几里得算法及其拓展
- 拓展欧几里得算法详解
- 拓展欧几里得算法
- 拓展欧几里得算法
- linux多线程同步
- Java变量和标识符
- 【算法】常用的排序算法之冒泡排序
- 常量后缀学习记录
- 在集群上安装Hadoop1.2.1,并配置好,启动hdfs后使用jps查看datanode,启动后过一会再看就消失了
- 拓展欧几里得算法
- 聊聊效率较高的几种常用排序算法
- Java线程池-线程复用原理(白话篇)
- 欢迎使用CSDN-markdown编辑器
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的,找出这个数字(使用位运算)
- Lights inside 3D Grid LightOJ
- python的基础语法(if,while,for,break,continue 特殊缩进)
- Static--方法与变量
- 【笔记】敏捷开发