推荐:https://www.zybuluo.com/samzhang/note/541890

扩展欧几里得,就是求出来ax+by=gcd(x,y)的x,y

为什么有解?

根据裴蜀定理,存在u,v使得au+bv=gcd(x,y)

证明:

这里面,c,e,就是所谓的u,v

对于ax+by=gcd(a,b)

因为gcd(a,b)=gcd(b,a%b)

ax+by=gcd(a,b)

bx1+(a%b)y1=gcd(b,a%b)

可以变成:ax+by=bx1+(a%b)y1

就是:ax+by=bx1+(a-[a/b]*b)y1

所以:ax+by=ay1+b(x1-[a/b]*y1)

所以,如果求出来y1,x1,就可以对应的求出来x,y

x=y1,y=(x1-[a/b]*y1)

不停地递归下去。

边界:

b==0 时,ax+by=gcd(a,b)

这时候,b是0,a就是gcd(a,b),所以x=1,y随便一个值,都是一个特解。

一般让y=0 (让|x|+|y|最小 -----------Monster_Yi)

(让|x+y|最小————SD_le)

(反正我也不知道是哪一个)

实测y等于几都可以,但是0小,一般不会爆int,爆掉的几率比较小。

递归返回去,上一步的x,y根据下一步的x,y赋值就好

代码:

void exgcd(int a,int b)
{
if(b==)
{
x=;
y=;
return;
}
exgcd(b,a%b);
k=x;
x=y;
y=k-a/b*y;
return;
}

这个没有传引用,直接交换的。x,y都是全局变量。便于理解。

但是代码太丑了。

传引用:

void exgcd(int a,int b,int &x,int &y){
if(b==){
x=,y=;return;
}
exgcd(b,a%b,y,x);
y-=(a/b)*x;
}

这里的代码是上一个版本的简略版,

传入下一步的时候,x,y传入的时候就交换了,相当于x=y1,y=x1

回溯之后的,y-=(a/b)*x, 因为这个时候的x就是 y1 , y已经赋值为x1,所以直接减就可以

当然,这里最后需要的x,y就直接传进去了。

应用:

1.求ax=1(mod b)  b不一定是质数。也就是求一般情况下的a的逆元(noip2012 同余方程)

2.ax+by=gcd(a,b) 可以将gcd(a,b)除下去,变成:a0x+b0y=1 同上

3.ax+by=c无整数解情况:gcd(a,b)不能整除c(左边可以提出来gcd,右边不行)

4.对于ax+by=c 的一般方程,先判断有没有解,再求出ax+by=gcd(a,b) 最后 x,y 乘上 c/gcd(a,b)

5.ax-by=c ,算出来ax+by=c , y再取相反数即可。

EXGCD 扩展欧几里得的更多相关文章

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

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

  2. 青蛙的约会(exgcd/扩展欧几里得)

    题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清 ...

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

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

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

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

  5. 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- ...

  6. UVA 10090 Marbles 扩展欧几里得

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

  7. POJ 1061 青蛙的约会 扩展欧几里得

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

  8. Codeforces7C 扩展欧几里得

    Line Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...

  9. SGU 106 The equation 扩展欧几里得好题

    扩展欧几里得的应用……见算法竞赛入门经典p.179 注意两点:1.解不等式的时候除负数变号 2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 ...

随机推荐

  1. bootstrapTable使用场景及方式

    场景一:混合开发,适用jsp.php前端不足  纯html结构 <div> <table id="table" data-toggle="table&q ...

  2. 收藏pdf 链接

    python 入门: https://files.cnblogs.com/files/minsons/python%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E6%B7% ...

  3. vue-cli中的check-versions.js配置文件包括semver,chalk,shell插件的解释

    本文介绍vue-cli脚手架build目录中check-versions.js的配置 本文件是用来检测node和npm版本的 直接上代码加注释 // 下面的插件是chalk插件,他的作用是在控制台中输 ...

  4. python基础学习笔记(五)

    字符串基本操作 所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最小值和最大值)对字符串同样适用,前面已经讲述的这些操作.但是,请注意字符串都是不可变的. 字符串的方法: 字符串从str ...

  5. 求去掉一条边使最小割变小 HAOI2017 新型城市化

    先求最小割,然后对残量网络跑Tarjan.对于所有满流的边,若其两端点不在同一个SCC中,则这条边是满足条件的. 证明见 来源:HAOI2017 新型城市化

  6. Buy the Ticket HDU 1133

    传送门 [http://acm.hdu.edu.cn/showproblem.php?pid=1133] 题目描述和分析 代码 #include<iostream> #include< ...

  7. M1/M2总结

    在团队项目中,我是dev之一,负责的部分主要是排序部分. 应该说在团队中大家都各司其职,尤其是PM在组织方面也费了很多心思. 当然我个人因为空间上的距离和团队的联系不是那么密切…… 如同老师所言,这是 ...

  8. 【实践报告】Linux基础实践一

    [chmod 命令] chmod命令是非常重要的,用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限. 该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设 ...

  9. 20135327郭皓--Linux内核分析第六周 进程的描述和进程的创建

    进程的描述和进程的创建 一.进程的描述 操作系统三大功能: 进程管理 内存管理 文件系统 进程描述符task_struct数据结构 task _ struct:为了管理进程,内核必须对每个进程进行清晰 ...

  10. <<梦断代码>>阅读笔记二

    这是第二篇读书笔记,这本书我已经读了有一大半了,感觉书中所描述的人都是疯子,一群有创造力,却又耐得住寂寞的疯子. 我从书中发现几点我比较感兴趣的内容. 第一个,乐高之梦.将程序用乐高积木一样拼接起来. ...