EXGCD 扩展欧几里得
推荐: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 扩展欧几里得的更多相关文章
- exgcd扩展欧几里得求解的个数
知识储备 扩展欧几里得定理 欧几里得定理 (未掌握的话请移步[扩展欧几里得]) 正题 设存在ax+by=gcd(a,b),求x,y.我们已经知道了用扩欧求解的方法是递归,终止条件是x==1,y==0: ...
- 青蛙的约会(exgcd/扩展欧几里得)
题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清 ...
- 同余问题(一)——扩展欧几里得exgcd
前言 扩展欧几里得算法是一个很好的解决同余问题的算法,非常实用. 欧几里得算法 简介 欧几里得算法,又称辗转相除法. 主要用途 求最大公因数\(gcd\). 公式 \(gcd(a,b)=gcd(b,a ...
- 浅谈扩展欧几里得[exgcd] By cellur925
关于扩展欧几里得从寒假时就很迷,抄题解过了同余方程,但是原理并不理解. 今天终于把坑填上了qwq. 由于本人太菜,不会用markdown,所以这篇总结是手写的(什么).(字丑不要嫌弃嘛) ****** ...
- 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- ...
- UVA 10090 Marbles 扩展欧几里得
来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...
- POJ 1061 青蛙的约会 扩展欧几里得
扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...
- Codeforces7C 扩展欧几里得
Line Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Status ...
- SGU 106 The equation 扩展欧几里得好题
扩展欧几里得的应用……见算法竞赛入门经典p.179 注意两点:1.解不等式的时候除负数变号 2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 ...
随机推荐
- Quartz_配置
quartz_jobs.xml job 任务 其实就是1.x版本中的<job-detail>,这个节点是用来定义每个具体的任务的,多个任务请创建多个job节点即可 name(必填) 任务名 ...
- Docker 创建容器以及管理命令(三)
1. 创建 Apache 容器 [root@centos7 ~]# docker run -d -p : httpd // -d: 放入后台运行 // -p: 指定端口映射关系(第一个为本地端口.第二 ...
- 2016-03-22 OneZero团队 Daily Scrum Meeting
会议时间: 2016-03-22 9:33-9:57am 会议内容: 一.在原有Sprint Backlog基础上,我们加了亮点(摇一摇功能:随机选取一条记录在界面显示,以提醒主页君回忆) 需求分析图 ...
- Linux内核第五节 20135332武西垚
20135332武西垚 在MenuOS中通过添加代码增加自定义的系统调用命令 使用gdb跟踪调试内核 简单分析system_call代码了解系统调用在内核代码中的处理过程 由于本周实验是在Kali虚拟 ...
- nginx+tpmcat+redis实现session共享
nginx+tpmcat+redis实现session共享 版本:nginx nginx-1.8.0.tar.gztomcat apache-tomcat-7.0.78.tar.gzredis re ...
- 使用git命令创建分支到团队项目
背景 在我们的团队中,我作为管理者,创建了一个叫HelloWorld的项目,大家各自在本地进行开发,将自己的工作贡献到我们的团队项目中.为了便于审核,我希望大家先将自己的贡献先放在属于自己的一个分支上 ...
- Practice2 结对子之“小学四则运算”
开发环境:Eclipse,js,css,html 程序完成的方向: 1.可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号.如: 2*(-4) = ...
- 第三个spring冲刺第9天
今天是第三阶段冲刺的最后第二天了,我们该实现的功能基本已经全部实现了,有填空的,选择题的,还有计时的,目前就是在查BUG,看看有哪些地方有BUG需要修改,以下截图是我们团队所做的功能截图: 首页: 填 ...
- PAT 1038 统计同成绩学生
https://pintia.cn/problem-sets/994805260223102976/problems/994805284092887040 本题要求读入N名学生的成绩,将获得某一给定分 ...
- Issue: business key in a call activiti
https://community.alfresco.com/thread/221280-business-key-in-a-call-activity 这个帖子有一些讨论和回复. https://c ...