推荐: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. 基于DDD的.NET开发框架ABP实例,多租户 (Saas)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍

    介绍 基于ABPZERO的多租户 (Saas)应用程序,采用ASP.NET MVC, Angularjs-介绍 ASP.NET Boilerplate作为应用程序框架. ASP.NET MVC和ASP ...

  2. devstack 安装(centos7)

    1. 创建devstack用户 sudo useradd -s /bin/bash -d /opt/stack -m stackecho "stack ALL=(ALL) NOPASSWD: ...

  3. Oracle数据库冷备份与热备份操作梳理

    Oracle数据库的备份方式有冷备份和热备份两种,针对这两种备份的实施过程记录如下: 一.Oracle冷备份 概念数据库在关闭状态下完成所有物理系统文件拷贝的过程,也称脱机备份.适合于非归档模式(即n ...

  4. Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)

    随着"互联网+"时代的业务增长.变化速度及大规模计算的需求,廉价的.高可扩展的分布式x86集群已成为标准解决方案,如Google已经在几千万台服务器上部署分布式系统.Docker及 ...

  5. beta阶段测试基本概况报告

    文件地址 测试基本信息                                                                                Bitmap 测试 ...

  6. 《Linux内核设计与实现》第3章读书整理

    第三章.进程管理 3.1进程 1.进程就是处于执行期的程序,但进程并不仅仅局限于一段可执行程序代码 2.执行线程: 简称线程,是在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组进程 ...

  7. 《Linux内核设计与分析》第十七章读书笔记

    设备与模块 关于设备驱动和设备管理,四种内核成分. 设备类型:在所有Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据 ...

  8. hg命令

    hg常用命令 hg命令跟git命令大同小异 hg version 查看hg版本 hg clone url 克隆代码仓库 hg branch newBranch 创建分支 hg update other ...

  9. Metrics.NET step by step使用Metrics监控应用程序的性能

    使用Metrics监控应用程序的性能 在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或 ...

  10. leetcode:Reverse Integer 及Palindrome Number

    Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, retur ...