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


********Update9.28**********
刚刚我们求出的是一组特值,那么如何求通值?
约定:设x0,y0为一组特解,t为任意整数,设a>b(不行再交换)
那么有 x=x0+b/gcd*t
y=y0-a/gcd*t
*******************************
奉上三道例题:
Ep1 青蛙的约会 Luogu P1516
花姐姐(@皎月半洒花)说的太棒了,我都不忍再去添加什么。
奉上链接,侵删!
Code
#include<cstdio>
#include<algorithm>
#include<cmath> using namespace std;
typedef long long ll; ll xx,yy,ans;
ll x,y,m,n,t; ll exgcd(ll a,ll b,ll &xx,ll &yy)
{
if(!b)
{
xx=;
yy=;
return a;
}
ans=exgcd(b,a%b,xx,yy);
ll tmp=xx;
xx=yy;
yy=tmp-a/b*yy;
return ans;
} int main()
{
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&t);
ll a=n-m,z=x-y;
if(a<) a=-a,z=-z;
exgcd(a,t,xx,yy);
if(z%ans) printf("Impossible");
else printf("%lld",((xx*(z/ans))%(t/ans)+(t/ans))%(t/ans));
return ;
}
注意体会同余方程转线性方程的思想与做法!
Ep2 倒酒 Luogu P1292
容易看出,得到酒的最小体积是gcd(a,b),这种思想在我以前写的“瓶子和燃料”一题中有所体现。模拟一下就可以发现,之后的次数就是ax+by=gcd(a,b)的一组最小解。
套exgcd板子就行了,但是注意取最小值的那一部分,其实感觉每个题取最小值的方法都各有千秋,都要独立思考,这是关键。
一个不错的题解,侵删。
Code
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll ; ll a,b,x,y,ans; ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=;y=;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-y*(a/b);
return d;
} int main()
{
scanf("%lld%lld",&a,&b);
ans=exgcd(a,b,x,y);
printf("%lld\n",ans);
a/=ans,b/=ans;
while(x>) x-=b,y+=a;
while(x+b<=&&y>=a) x+=b,y-=a;
printf("%lld %lld",-x,y);
return ;
}
ps:while(x>0)那里如果写成while(x)竟会死循环,还是老实一点吧。
Ep3 同余方程 Luogu P1082
把同余方程转一下。直接套exgcd模板,取最小值部分,lyd老师的讲解:
“用exgcd求出一组特解x0,y0,则x0就是原方程的一个解,通解为所有膜b与x0同余的整数,通过取模操作把解的范围移动到1~b”之间,就得到了最小正整数解。”
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=;
y=;
return a;
}
int r=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return r; }
int main()
{
int a,b,x,y;
scanf("%d%d",&a,&b);
exgcd(a,b,x,y);
cout<<(x+b)%b;
return ;
}
浅谈扩展欧几里得[exgcd] By cellur925的更多相关文章
- 同余问题(一)——扩展欧几里得exgcd
前言 扩展欧几里得算法是一个很好的解决同余问题的算法,非常实用. 欧几里得算法 简介 欧几里得算法,又称辗转相除法. 主要用途 求最大公因数\(gcd\). 公式 \(gcd(a,b)=gcd(b,a ...
- 扩展欧几里得(exgcd)与同余详解
exgcd入门以及同余基础 gcd,欧几里得的智慧结晶,信息竞赛的重要算法,数论的...(编不下去了 讲exgcd之前,我们先普及一下同余的性质: 若,那么 若,,且p1,p2互质, 有了这三个式子, ...
- 扩展欧几里得(exgcd)-求解不定方程/求逆元
贝祖定理:即如果a.b是整数,那么一定存在整数x.y使得ax+by=gcd(a,b).换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍.(可以来判断一个这样的式子有没有解)有一个 ...
- 扩展欧几里得 exGCD
Elementary Number Theory - Extended Euclid Algorithm Time Limit : 1 sec, Memory Limit : 65536 KB Jap ...
- 数论--扩展欧几里得exgcd
算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...
- 浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...
- EXGCD 扩展欧几里得
推荐:https://www.zybuluo.com/samzhang/note/541890 扩展欧几里得,就是求出来ax+by=gcd(x,y)的x,y 为什么有解? 根据裴蜀定理,存在u,v使得 ...
- exgcd扩展欧几里得求解的个数
知识储备 扩展欧几里得定理 欧几里得定理 (未掌握的话请移步[扩展欧几里得]) 正题 设存在ax+by=gcd(a,b),求x,y.我们已经知道了用扩欧求解的方法是递归,终止条件是x==1,y==0: ...
- 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- ...
随机推荐
- T1992 聚会 codevs
http://codevs.cn/problem/1992/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小S 想要从某地 ...
- 学习日常笔记<day17>jdbc基础
1.jdbc入门 1.1.jdbc定义 使用java代码发送sql语句的技术就是jdbc技术 1.2.使用jdbc发送sql前提 需要登录数据库服务器(数据库的IP地址,端口,数据库用户名,密码) / ...
- 使用微软的 ilasm 和 ildasm 对. net程序进行编译和反编译
为了保证示例的完整性,请先准备好一个 c#写的 exe 程序,或者可以使用我提供的 exe 程序也可以(很简单,为了测试这里仅生成了一个带按钮的 winform,单击按钮提示弹窗) Test WinF ...
- 转:String数组初始化
近日,笔者在java编程中因为疏忽对String数组的初始化定义错误,导致程序运行出错.现将所理解的String数组在此进行说明,并对String数组初始化进行分析. //一维数组String[] s ...
- html5开发手机打电话发短信功能
原文:http://www.open-open.com/code/view/1449843459332 在很多的手机网站上,有打电话和发短信的功能,对于这些功能是如何实现的呢.其实不难,今天我们就用h ...
- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装
平时一直玩RHEL/CentOS/OEL系列的操作,玩虚拟化也是采这一类系统,kvm在RHEL6系列操作系统支持比较好,本文采用采用OEL6.3操作系统,网上所有文章都说KVM比xen简单,我怎么感觉 ...
- hdu 4970 Killing Monsters(数组的巧妙运用) 2014多校训练第9场
pid=4970">Killing Monsters ...
- Python爬虫开发【第1篇】【爬虫案例】
案例一:网站模拟登录 # douban.py from selenium import webdriver from selenium.webdriver.common.keys import Key ...
- JSON with Java
work with json-lib.jar import net.sf.json.JSONArray;import net.sf.json.JSONException;import net.sf.j ...
- java操作json
import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class ReadJson { public static v ...