推荐: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. Quartz_配置

    quartz_jobs.xml job 任务 其实就是1.x版本中的<job-detail>,这个节点是用来定义每个具体的任务的,多个任务请创建多个job节点即可 name(必填) 任务名 ...

  2. Docker 创建容器以及管理命令(三)

    1. 创建 Apache 容器 [root@centos7 ~]# docker run -d -p : httpd // -d: 放入后台运行 // -p: 指定端口映射关系(第一个为本地端口.第二 ...

  3. 2016-03-22 OneZero团队 Daily Scrum Meeting

    会议时间: 2016-03-22 9:33-9:57am 会议内容: 一.在原有Sprint Backlog基础上,我们加了亮点(摇一摇功能:随机选取一条记录在界面显示,以提醒主页君回忆) 需求分析图 ...

  4. Linux内核第五节 20135332武西垚

    20135332武西垚 在MenuOS中通过添加代码增加自定义的系统调用命令 使用gdb跟踪调试内核 简单分析system_call代码了解系统调用在内核代码中的处理过程 由于本周实验是在Kali虚拟 ...

  5. nginx+tpmcat+redis实现session共享

    nginx+tpmcat+redis实现session共享 版本:nginx nginx-1.8.0.tar.gztomcat apache-tomcat-7.0.78.tar.gzredis  re ...

  6. 使用git命令创建分支到团队项目

    背景 在我们的团队中,我作为管理者,创建了一个叫HelloWorld的项目,大家各自在本地进行开发,将自己的工作贡献到我们的团队项目中.为了便于审核,我希望大家先将自己的贡献先放在属于自己的一个分支上 ...

  7. Practice2 结对子之“小学四则运算”

    开发环境:Eclipse,js,css,html 程序完成的方向: 1.可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号.如: 2*(-4) = ...

  8. 第三个spring冲刺第9天

    今天是第三阶段冲刺的最后第二天了,我们该实现的功能基本已经全部实现了,有填空的,选择题的,还有计时的,目前就是在查BUG,看看有哪些地方有BUG需要修改,以下截图是我们团队所做的功能截图: 首页: 填 ...

  9. PAT 1038 统计同成绩学生

    https://pintia.cn/problem-sets/994805260223102976/problems/994805284092887040 本题要求读入N名学生的成绩,将获得某一给定分 ...

  10. Issue: business key in a call activiti

    https://community.alfresco.com/thread/221280-business-key-in-a-call-activity 这个帖子有一些讨论和回复. https://c ...