Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)

手把手教你用Vivado给蜂鸟E203 FPGA开发板烧录程序并跑CoreMark 本文详细介绍了如何使用Vivado为蜂鸟E203 FPGA开发板烧录程序并运行CoreMark测试。从环境搭建、工程配置到比特流生成和硬件烧录,逐步指导开发者完成整个硬件验证流程,特别适合初学者。文章还提供了常见问题解决方案和性能优化建议,帮助开发者快速掌握FPGA开发与RISC-V处理器验证技巧。 阅读详情
一、Description
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。

Input

输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。

Output

输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行"Impossible"

二、题目分析
        这道题用到了扩展欧几里得算法解线性同余问题,小弟数论没怎么学。今天看到一篇精辟的题解,于是略作修改,引用之。原文请看http://blog.youkuaiyun.com/swordholy/article/details/4423543

        根据题意可知,题目要求的是求(X + K * M)mod  L=(Y + K  *  N)mod  L这个模方程的k的最小整数解;跟据模的性质对这个方程变形得:K * ( M - N ) +  T * L=Y--X( T为引进的一整数);

       令A= (M - N) ;  B = Y - X; 得:K * A + T * L =B       ( 0)

        看到这个式子是不是感觉很眼熟,对,它就是扩展欧几里得法能解的标准方程A * X + B * Y= D 的标准形;唯一的不同是扩展欧几里得D 是前面两系数A,B的最大公约数;而(0)式中的B就不能保证了。

       1、不过没关系,先用扩展欧几里得得出K * A + T *L=gac(A,L)  的一个解k0,t0;再观察两个式子:

                       K * A + T * L =B       ( 0)

                      K0 * A + T0 * L=D      (1)  (令D = gcd(A,L))

        将(0)式两边都除以D,得:

                   K * (A / D)+   T * (L /D)=B/D

         因为D为A,B的最大公约数,所以A / D,L / D为整数,所以B / D必定为整数,否则方程无解;

        将(1)式两边都乘以B / D 与( 0 )式比较:

                   K * A + T * L =B       ( 0)

                   K0 *( B / D) * A + T0 *( B / D)* L=B   (1)

       得K = K0 * B / D;    T = T0 * B / D;

       2、接下来就是由一个解扩展成一个解系:

             ( 1)除以D得:       K0 * (A / D ) + T0 * ( L / D)=1  

              因为(A / D )和( L / D)互质,将方程写成:

                             (K0 + U * ( L / D))  *  (A / D )  +  ( T0 +  V * (A / D ) )  *  ( L / D)=1;

                            只要U * ( L / D) * (A / D ) +  V * (A / D ) ) * ( L / D)=0成立就行;

             所以K ,T 的解系可以写成 k = (K0 + U * ( L / D))  *  (B / D )  ,T=( T0 +  V * (A / D ) )  *  ( B / D)

            接下来就是求k的最小整数解了;

            因为K = (K0 mod (L / D) + (U + K0 / ( L / D) ) * ( L / D)) * (B / D);

            所以Kmin=(K0 * (B / D)) mod (L / D);

      3、 大功基本高成了,还差最后一步,那就是如何用扩展欧几里得解K  *  A + T * L=gac(A,L) 

           对A * X + T * L = D;
           递归调用时令A = B ; B = A % B;(辗转相除法,求最大公约数)
           将其变为形式(2) B  * X + A % B * Y = D;
                             变形:B  * X + A  * Y - (A / B) *  B  * Y = D;                        

                             再变:A * Y+ B ( X - A / B * Y)=D; (3)

                      与(2)式B  * X + A % B * Y = D;比较:
             得:
              当A = B ; B = A  % B时:X = Y ; Y = X - A / B * Y;调用过程中的X  , Y 就是对应的A , B 的解;当回到顶层时,A , B 就 是最初的A ,B,所以此时的X,Y就是所求解。

三、Java代码

       

import java.util.Scanner; 

public class Main { 

    static long x0, y0; 

    public static void main(String[] args) { 
        Scanner scan = new Scanner(System.in); 
        long x = scan.nextInt(); 
        long y = scan.nextInt(); 
        long m = scan.nextInt(); 
        long n = scan.nextInt(); 
        long L = scan.nextInt(); 
        if (x > y) { 
            long t = y; 
            y = x; 
            x = t; 
            t = n; 
            n = m; 
            m = t; 
        } 
        long a = Math.abs(m - n); 
        long b = L; 
        long c; 
        if (m > n) { 
            c = y - x; 
        } else { 		
            c = x - y + L; 
        } 

        long d = gcd(a , b); 
        if(c%d!=0){ 
            System.out.println("Impossible"); 
        }else{ 
            long add1 = x0*c/d ; 
            long add2 = Math.abs(b/d); 
            while( add1 <0 ){ 
                add1 += add2; 
            } 
            while(add1 - add2 >= 0){ 
               add1 -= add2; 
            } 
            System.out.println(add1); 
        } 
    } 
    public static long gcd(long a, long b) { 
        long t, d; 
        if (b == 0) { 
            x0 = 1; 
            y0 = 0; 
            return a; 
        } 
        d = gcd(b, a % b); 
        t = x0; 
        x0 = y0; 
        y0 = t - a / b * y0; 
        return d; 
    } 
  } 


 

poj 1061青蛙的约会 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 90083   Accepted: 16257 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面 阅读详情

相关推荐

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

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

qq_30964897的博客 771

青蛙相会(frog)

【问题描述】 有两只青蛙,青蛙A和青蛙B,他们在同一条经纬线上。他们将同时出发,沿着经纬线朝西跳。规定经纬线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。求出它们跳了几次以后才会位于同一点。 【输入格式】 输入只包括一行5个整数x,y,m,n,L 【输出格式】 输出碰面所需要的跳跃次数,如果永远不可能碰面...

qq_38376545的博客 293

POJ-1061 青蛙的约会

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

h_bby的博客 541

青蛙的约会(POJ-1061)

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

Alex_McAvoy的博客 1810

【纯血鸿蒙】安装hdc工具

参考资料:

oh.K 5555

家庭宽带IPv6避坑指南:如何通过DHCPv6-PD获取公网地址(附OpenWRT配置)

本文详细解析了家庭宽带IPv6的地址分配机制,重点介绍了通过DHCPv6-PD获取公网地址的方法,并提供了OpenWRT路由器的具体配置步骤。从路由器通告(RA)标记位到前缀委派(PD)流程,帮助用户解决IPv6部署中的常见问题,实现稳定高效的IPv6网络连接。

backprop5master的博客 1206

POJ - 1061 青蛙的约会 (扩展欧几里得找最小正整数解)

题意:两只青蛙在圆圈上追赶,圆圈我们可以看作是一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。总长L米。现在要你求出它们跳了几次以后才会碰面。 思路:设跳了t次以后才会碰面,则有(x + tm) % L = (y + tn) % L,即 (x + tm) - (y + tn) = PL,整理得:(n -...

GYH0730的博客 495

瑞芯微RK3576上手实测:8nm新U配6TOPS NPU,做AIoT项目选它还是RK3588/RK3568?

本文深度评测瑞芯微RK3576芯片在中高端AIoT项目中的表现,对比RK3588和RK3568的性能差异。RK3576采用8nm工艺,配备6TOPS NPU,在解码能力、AI推理效率和功耗控制方面表现均衡,是中端项目的黄金选择。实测数据显示其在多路视频解码和AI加速性能上优势明显,特别适合智能摄像头和工业HMI设备。

weixin_42627853的博客 717

扩展欧几里德

P1009清帝之惑之康熙 Accepted 标签:浙江2000清帝之惑[显示标签] 背景 康熙是中国历史乃至世界历史中最伟大的帝王之一,清除螯拜,撤除三藩,统一台湾,平定准葛尔叛乱;与此同时,出众的他也被世界各国遣清使臣所折服。康熙是历史上少有的全人,不仅文武兼得,而且在各各方面都有见地,比如说航海、数学、英语、构图、建筑

梦醒了 617

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

AI Agent在智能腰带中的姿势矫正与提醒

随着人们生活方式的改变,长时间不正确的坐姿、站姿等不良姿势问题日益普遍,这不仅会导致身体疲劳,还可能引发颈椎病、腰椎病等多种健康问题。智能腰带作为一种可穿戴设备,具有实时监测人体姿势的潜力。本研究的目的是将AI Agent引入智能腰带,实现对人体姿势的准确识别、矫正与提醒功能。本研究的范围涵盖了从AI Agent的核心算法原理到智能腰带的实际开发与应用。包括传感器数据的采集与处理、机器学习算法的选择与训练、智能腰带的硬件设计与软件开发,以及在不同场景下的实际应用测试。本文共分为十个部分。

AI 原生应用开发的博客 344

POJ 1061青蛙的约会题解

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

u012403020的博客 1027

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2803

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

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

DJR228的专栏 733

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 284

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 96066   Accepted: 17907 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到

wust_ZJX的专栏 3076

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

POJ 1061 青蛙的约会

POJ 1061 青蛙的约会 1. 数学题,欧几里得算法,求不定方程的整数解问题; 2. 必要的数学知识(转): 此题其实就是扩展欧几里德算法-求解不定方程,线性同余方程。   设过s步后两青蛙相遇,则必满足以下等式:     (x+m*s)-(y+n*...

dayong9372的博客 212

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

POJ1061青蛙的约会

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 107883   Accepted: 21571 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰

Guang_Novak的博客 402

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

POJ 1061 青蛙的约会 笔记——扩展欧几里得

青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 123638 Accepted: 26379 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重...

Triumphs的博客 560

Poj 1061 青蛙的约会(扩展欧几里得)

Poj 1061 青蛙的约会(扩展欧几里得) Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情...

dilan3700的博客 169
上一篇: Poj1163 The Triangle(动态规划求最大权值的路径)
下一篇: Poj2656(水题)
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值