欧几里得扩展算法详解及POJ1061

【代码超详解】POJ 1061 青蛙的约会(扩展欧几里得算法,0 ms) 一、题目描述 二、算法分析说明与代码编写指导 三、AC 代码(0 ms) #include<cstdio> #pragma warning(disable:4996) //Solve ax + by = GCD(a, b) for x, y. template<class _Ty> _Ty extgcd(const _Ty& a, const _Ty& ... 阅读详情

最初是在PKU的acm上刷题,刚接触1061青蛙的约会这道题的时候写了个简单暴力的方法,在一定范围内感觉挺对的,但是提交后WA了,于是在一起K题的战友那里第一次听说了这个算法——欧几里得扩展算法。费了很大的劲之后,终于有些了解这个算法了,在这记录下。

所谓扩展欧几里得算法就是给定一组a,b,求aX+bY=gcd(a,b)的解(gcd表示最大公约数,根据数论中的知识,这个方程一定有解)。下面是求解的代码:

 

	public static int x,y;
	public static int extendgcd(int a,int b){
		if(b==0){
			x=1;
			y=0;
			return a;
		}
		int d=extendgcd(b,a%b);
		int temp=x;
		x=y;
		y=temp-a/b*x;
		return d;
	}


为什么要这样求呢,推算过程如下:aX+bY=gcd(a,b)=gcd(b,a%b)=bX'+(a%b)Y'=bX'+(a-a/b*b)Y'=aY'+b(X'-a/bY')(/为整除),所以,X=Y‘,Y=X'-a/bY'。

经过上面的步骤,求出了aX+bY=gcd(a,b)(0)的一组解(x,y),但在1061这个题中,要求解的是aX+bY=c(1)的最小整数解,到这只是迈出了第一步。

将式子1两边同时除以d=gcd(a,b),如果d不能整除c,说明式1没有整数解,除完后得a'X+b'Y=c'(2),将式子0两边同时除以d,得a'X+b'Y=1,显然(2)式的解就是(c'x,c'y),所有整数解的集合为(c'x+b'k,c'y-a'k)(其中k是任意整数)。因为要求最小整数解,所以还要再处理一下,以c'x+b'k为例,它的最小整数值为:(c'x%b'+b')%b',第一步是为了让它成为绝对值小于b'的整数,然后因为可能会变为负数所以加b',又因为可能原本是正数,加b'后大于b',所以又对b'取模。完整的题目1061的AC代码如下:

import java.util.Scanner;

public class Main {

	public static long t,p;
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		long x=in.nextLong();
		long y=in.nextLong();
		long m=in.nextLong();
		long n=in.nextLong();
		long L=in.nextLong();
		long a=m-n,b=L,c=y-x;
		if(a<0){
			a=-a;
			c=-c;
		}
		long d=extendgcd(a,b);
		if((m==n&&x!=y)||c%d!=0)
			System.out.println("Impossible");
		else{
			b=b/d;
			c=c/d;
			t=c*t;
			System.out.println((t%b+b)%b);
		}
	}
	
	public static long extendgcd(long a,long b){
		if(b==0){
			t=1;
			p=0;
			return a;
		}
		long d=extendgcd(b,a%b);
		long temp=t;
		t=p;
		p=temp-a/b*t;
		return d;
	}
}


 

题解: poj 1061 nefu 84(拓展欧几里得) POJ1061 Language:Default青蛙的约会 Time Limit: 1000MSMemory Limit: 10000KTotal Submissions: 105002Accepted: 20595Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一 阅读详情

相关推荐

以POJ1061青蛙的约会为例谈扩展欧几里得算法

以POJ1068青蛙的约会为例谈扩展欧几里得算法

Dafang_Xu的博客 1588

python语言编程欧几里得算法及扩展欧几里得算法

欧几里得算法:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 代码如下: def gcd(a,b): # *************begin************# if a<b: t=a a=b b=t while a%b!=0: temp=a%b a=

c_programj的博客 9201

欧几里得和扩展欧几里得算法

欧几里得算法又称辗转相除法,是求解两个数的最大公约数的算法,基本定义为: 设 a=qb+r,其中a,b,q,r都是整数,则:gcd(a,b)= gcd(b,r) 利用递归实现该算法: long long gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } 辗转相除法的应用:(水题) nef

而濡木染 826

扩展欧几里德算法

定义 设a和b不全为0,则存在整数x和y,使得 gcd(a,b) = xa+yb 注: 油欧几里得得 gcd(a,b) = gcd(b,a%b); gcd(a,0) = a; 若 gcd(a,b)=1 则称a和b互素 整数 a和b 互素的充分必要条件:存在整数X和Y,使得xa+yb=1; 扩展

wsxiaofeioo的博客 383

poj算法题1061——青蛙的约会

青蛙的约会 http://poj.org/problem?id=1061 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总

qq_30964897的博客 771

Discrete Optimization (Coursera) 学习笔记 Week 1 introduction (开个帖子)

Week 1 Introduction 这位教授Pascal Van Hentenryck 真的算是优化领域神级别的人物了吧?截一张Google scholar的图大家感受一下… 居然在Coursera上看到了他开的课:Discrete Optimization。试听了几节后,发现讲得很有激情,而且深入浅出。遂决定花暑假跟完这一门课。 这门课每周花两三个小时介绍基础概念,然后得花十几个小时写作业(coding)… 一开始以为Coursera上的课的作业应该不会太难,然后第一次作业(knapsack)我就被

ZJ_11701的博客 656

【数论系列】 欧几里得算法与拓展欧几里得

扩展欧几里得算法是欧几里得算法(辗转相除法)的扩展版本,该算法除了能够求出a、b的最大公约数,还能够同时求出 ax + by = gcd(a,b) 的一组正整数特解x、y(根据裴蜀定理可知此解必定存在)。扩展欧几里得常用来求形如方程:ax + by = c 的整数通解或者特解。等式方程 ax+by = c 是不一定有整数解x、y的,但是已知:若 c%gcd(a,b)==0,则方程ax + by = c 必定存在整数解,否则必定无解。

这里是阿安的博客 8491

SAP PP工艺路线Routing保姆级配置指南:从CA01创建到替代/并行顺序实战

本文详细解析SAP PP模块中工艺路线(Routing)的配置与应用,从基础创建(CA01)到高级功能如替代顺序和并行顺序的实战操作。通过真实案例演示,帮助用户掌握SAP PP工艺路线的精细化管理,提升生产流程效率。

weixin_30898555的博客 388

扩展欧几里得算法

1、欧几里得算法 又名“辗转相除法”; 迄今为止,已知的最古老的算法 用于快速计算两个数字的最大公约数 还可以用于快速求解 a * x + b * y = 1 方程的一组整数解 定理:a 和 b 两个整数的最大公约数等于 b 和 a % b 的最大公约数 形式化表示:假设 a, b != 0, 则 gcd(a, b) = gcd(b, a % b) 证明1: 1. 设 c = gcd(a, b), 则 a = cx, b = cy 2. 可知 a % b = r = a - k * b = cx -

明朗晨光的专栏 501

嵌入式通讯协议全解析:UART、I2C、SPI、CAN与Modbus实战指南

通讯协议是嵌入式系统设计的核心基础,也是面试与工程实践中避不开的关键环节。从串口UART的异步收发,到I2C总线寻址与SPI高速全双工传输,再到RS485差分长距离通信、CAN总线多主仲裁机制,以及工业领域事实标准的Modbus RTU协议,每一种技术都对应着特定的应用场景与设计权衡。理解协议背后的物理层原理、时序特征和工程坑点,才能真正解决设备间通信的选型、调试与健壮性问题。本文从基础概念出发,系统梳理各类嵌入式通讯协议的工作机制,并结合实际代码示例与对比表格,帮助开发者在面对面试问题或项目设计时,构建从

weixin_42520573的博客 276

属性基加密(Attribute-based Encryption, ABE)

KP-ABE中,用户的密钥定义了访问策略,密文的属性与策略进行匹配。CP-ABE中,密文定义了访问策略,用户的属性与策略进行匹配。

2201_75392924的博客 1830

信息安全数学基础——扩展欧几里得算法

本文主要介绍了扩展欧几里得算法,其在求解乘法逆元时会非常有帮助。

weixin_45930035的博客 2948

十五、SAP-物料需求计划(MRP)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 1092

【详解】POJ-1061-青蛙的约会【扩展欧几里得算法】

POJ-1061-青蛙的约会【扩展欧几里得算法】 模板: int gcd(int a, int b) {   if(b == 0)    return a; return gcd(b, a % b); } 扩展模板: int exgcd(int a, int b, int &amp;x, int &amp;y){   if(b == 0){   x = 1...

lhc----- 604

【AI应用实战-OpenCode】OpenCode安装部署(一)

OpenCode是一款2026年流行的开源AI编程工具,兼具轻量代码编辑器和智能编码代理功能。其核心优势包括:完全免费开源(MIT协议)、全平台兼容、支持75+大模型(含本地部署)、内置完整编程功能链(代码补全/Git集成/AI调试等),且所有数据本地存储确保隐私安全。相比Copilot等商业工具,OpenCode提供更自由的模型选择和零门槛使用体验。安装要求Windows10+/macOS12+/Linux主流发行版,仅需200MB空间和4G内存。该工具完美兼容VSCode生态,支持终端/桌面/IDE三种

2427

软考高级架构师笔记-10数学计算题

专栏《软考高级架构设计师》更新了,本章列举了10个场景计算题的解法,温故而知新,大家快来卷一卷

java后端开发的博客,不仅仅是后端开发 1598

poj 1061 青蛙的约会 扩展欧几里得

写在前面:关于扩展欧几里得 已知存在数x,y使得对于确定的a,b有ax+by=gcd(a,b),所以对于一般的ax+by=c,只要gcd(a,b)能够整除c,就一定存在解x,y,且解的个数为c/gcd(a,b)。 关于如何求x,y ax+by=gcd(a,b)=gcd(b,a%b)=bx'+(a%b)y',整理之后可以得到x=y',y=(x'-a/cy'),又因为gcd(d,0)(d为gcd

ctrss的博客 447

Coze 上 OpenClaw 完整使用攻略(零代码 + 24 小时在线 + 飞书 / 微信接入)

Coze(扣子)是目前国内零门槛部署 OpenClaw 最友好的平台,无需服务器、不用命令行,5 分钟即可拥有可执行本地 / 云端任务的 AI 助手,还能一键发布到飞书、微信、钉钉等 IM。

hy行者勇哥的博客 2922

poj1061 扩展欧几里得算法

poj1061青蛙的约会 首先要列出关系方程: 由于两个青蛙是往同一个方向跳跃的,所以两只青蛙相遇的时候,一定是一只青蛙比另一只青蛙多跳整数圈数。 设跳跃的次数为t,圈数为p,那么     (x+mt)-(y+nt)=pl 即t(n-m)-pl=x-y 此题就是求t的最小正整数解 其中n-m、l、x-y已知,所以这是一个有两个未知量的不定方程,那么就要用扩展欧几里得算法。 扩展欧几

竹丙丙丙丙 441

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

POJ 1061青蛙的约会 ,扩展欧几里得算法

POJ 1061青蛙的约会 ,扩展欧几里得算法

DJR228的专栏 733

【POJ 1061】青蛙的约会(扩展欧几里得)

【POJ 1061】青蛙的约会(扩展欧几里得) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 103473   Accepted: 20116 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条

ACMer' 4204

POJ 1061 青蛙的约会

POJ 1061 青蛙的约会 题目链接 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,

旺崽的博客 2760

POJ 1061青蛙的约会题解

POJ 1061青蛙的约会题解 网上似乎有不少此题的解法。我这个post和其他人的相比主要时想说下面几点。 1. 给出一个试图不死记硬背公式的思路; 2. 谈谈暴力解为什么看起来这么诱人,却无法通过; 3. 一些细节及对此题的评价(个人观点) 原题请参考poj: http://poj.org/problem?id=1061 我认为ACM/ICPC应该给人思维的快乐,甚至带有...

u012403020的博客 1027

POJ-1061-青蛙的约会

POJ-1061-青蛙的约会 传送门 这道题就是简单的扩展欧几里得的运用~ 题面是中文~就不解释啦 设青蛙a初始坐标为xx,青蛙a一次跳m个单位,青蛙b初始坐标为yy,青蛙b一次跳n个单位。L是纬线的长度。 (其实我还百度了一下纬线是纵向还是横向啊哈哈哈,是横向哈~) 我们设跳t次后可以相遇。 那么青蛙a跳的距离: xx + t * m; 青蛙b跳的距离为: yy + t * n; 他们相遇要满足...

qq_44624316的博客 202

POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.youkuaiyun.com/suncongbo/article/details/79382991 题目链接: (poj)http://poj.org/problem?id=1061 (b...

suncongbo's blog 194

poj1061 青蛙的约会 终于明白了那个%

http://poj.org/problem?id=1061 这题是大多大佬介绍完扩展欧几里得后拿来练习的。于是第一次做的时候就严格按照扩展欧几里得的办法, x = x+k(c/gcd), y = y - k(c/gcd)了。 今天回过头来再看的时候发现还有一种处理负数的办法,就是在最后处理时先取模,再加模,再取模 第一步取模,使得到的答案绝对值小于模,加上模后使得值大于0但小于模 当时...

solego’s blog 250
上一篇: 扩展欧几里德算法 线性同余方程 中国剩余定理
下一篇: java Map常用操作
热血大婶
博客等级 码龄16年 58粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血大婶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值