【题目描述】

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

我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。

【输入格式】

输入只包括一行5个整数x,y,m,n,L

其中0<x≠y < =2000000000,0 < m、n < =2000000000,0 < L < =2100000000。

【输出格式】

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

【算法分析:】

设最少需要的次数为k,容易得出:

求一个非负整数k,使得:

可以看出,问题变成了求不定方程的x的非负最小值

求出一组x、y,使得ax+by=gcd(a,b):

ax + by = gcd(a, b)
= gcd(b, a % b)
= bx' + (a % b)y'
= bx' + (a - [a / b] * b)y'
= bx' + ay' - [a / b] * by'
= ay' + b(x' - [a / b]y') ∴x = y', y = x' - [a / b] * y' 终止条件:
b = 0时:a * + b * = a
即x = , y =
递归求解

扩展欧几里得

求出一组ax+by=c的解:

用扩展欧几里得先求出ax' + by' = gcd(a, b)的一组解, x',  y'及gcd(a, b)的值

若c mod gcd(a, b) ≠
方程无解(整数范围内) 令:
c = gcd(a, b) * k
∴k = c / gcd(a, b)
∴ax + by = c
= k * gcd(a, b)
∴ax + by = akx' + bky'
根据恒等定理:
ax = akx', by = bky'
∵a != 且 b !=
∴x = kx', y = ky'
∵k = c / gcd(a, b)
∴x = x' * c / gcd(a, b)
y = y' * c / gcd(a, b)

不定方程(同余方程)

使得x非负且最小:

用扩展欧几里得先求出ax' + by' = gcd(a, b)的一组解, x',  y'及gcd(a, b)的值
lcm(a, b) = a * b / gcd(a, b) ax + lcm(a, b) + by - lcm(a, b) = c
ax + a * b / gcd(a, b) + by - a * b / gcd(a, b) = c
a(x + b / gcd(a, b)) + b(y - a / gcd(a, b)) = c
∴x + 或 - 任意倍数的b / gcd(a, b)均有对应的y的整数解 设 t = b / gcd(a, b)
x = ((x' * c / gcd(a, b)) % t + t) % t 为方程的最小非负解.

x非负且最小

扩欧代码及详解见我的github:
DEVILK1

【代码:】

 #include<iostream>
#include<cstdio>
using namespace std; int x, y, m, n, l; int read() {
int x = , f = ; char ch = getchar();
while(ch < '' || ch > '') {
if(ch == '-') f = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
x = (x << ) + (x << ) + (ch ^ ),
ch = getchar();
return x * f;
} int ex_gcd(int a, int b, int &x, int &y) {
if(b == ) {
x = , y = ;
return a;
}
int g = ex_gcd(b, a % b, y, x);
y -= a / b * x;
return g;
} int main() {
x = read(), y = read();
m = read(), n = read();
l = read();
int a = n - m, c = x - y;
if(a < ) a = -a, c = -c;
int x0, y0;
int g = ex_gcd(a, l, x0, y0);
if(c % g != ) {
puts("Impossible");
return ;
}
int t = l / g;
x0 = ((1LL * x0 * c / g) % t + t) % t;
cout << x0 << endl;
}

【洛谷】【扩欧】P1516 青蛙的约会的更多相关文章

  1. 洛谷 P1516 青蛙的约会 解题报告

    P1516 青蛙的约会 题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...

  2. 洛谷——P1516 青蛙的约会

    P1516 青蛙的约会 题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...

  3. P1516 青蛙的约会

    P1516 青蛙的约会x+mt-p1L=y+nt-p2L(m-n)t+L(p2-p1)=y-x令p=p2-p1(m-n)t+Lp=y-x然后套扩欧就完事了 #include<iostream&g ...

  4. 解题报告:luogu P1516 青蛙的约会

    题目链接:P1516 青蛙的约会 考察拓欧与推式子\(qwq\). 题意翻译? 求满足 \[\begin{cases}md+x\equiv t\pmod{l}\\nd+y\equiv t\pmod{l ...

  5. P1516 青蛙的约会和P2421 [NOI2002]荒岛野人

    洛谷 P1516 青蛙的约会 . 算是手推了一次数论题,以前做的都是看题解,虽然这题很水而且还交了5次才过... 求解方程\(x+am\equiv y+an \pmod l\)中,\(a\)的最小整数 ...

  6. 洛谷P1516 青蛙的约会(扩展欧几里德)

    洛谷题目传送门 很容易想到,如果他们相遇,他们初始的位置坐标之差\(x-y\)和跳的距离\((n-m)t\)(设\(t\)为跳的次数)之差应该是模纬线长\(l\)同余的,即\((n-m)t\equiv ...

  7. 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...

  8. 【题解】P1516 青蛙的约会(Exgcd)

    洛谷P1516:https://www.luogu.org/problemnew/show/P1516 思路: 设两只青蛙跳了T步 则A的坐标为X+mT   B的坐标为Y+nT 要使他们相遇 则满足: ...

  9. luogu P1516 青蛙的约会(线性同余方程扩展欧几里德)

    题意 题解 做了这道题,发现扩欧快忘了. 根据题意可以很快地列出线性同余方程. 设跳了k次 x+mkΞy+nk(mod l) (m-n)kΞ-(x-y)(mod l) 然后化一下 (m-n)k+(x- ...

随机推荐

  1. SpringBoot整合mybatis-plus入门

    pom.xml中加入如下依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>myba ...

  2. 撩课-Web大前端每天5道面试题-Day19

    1.实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制 考察点1:对于基本数据类型和引用数据 ...

  3. SimpleScalar Course Project

    https://blog.csdn.net/wahaha_nescafe/article/details/8500186 https://blog.csdn.net/wahaha_nescafe/ar ...

  4. K:Treap(堆树)

      Treap=Tree+Heap.Treap是一棵二叉排序树,它的左子树和右子树分别是一个Treap,和一般的二叉排序树不同的是, Treap记录一个额外的数据, 就是优先级.Treap在以关键码构 ...

  5. 微信网页授权获取code

    <script> var code = GetQueryString('code'); var callback = 'personal.html'; var appId = " ...

  6. Layabox 3D游戏开发学习笔记---射线检测,鼠标控制物体运动

    核心要点:3D物体碰撞是靠射线检测,射线与碰撞器相撞获取对应的碰撞点信息. class RayPicking03 { private ray: Laya.Ray; private point: Lay ...

  7. 【代码笔记】iOS-gif图片播放

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  8. atitit.js 与c# java交互html5化的原理与总结.doc

    atitit.js 与c# java交互html5化的原理与总结.doc 1. 实现html5化界面的要解决的策略1 1.1. Js交互1 1.2. 动态参数个数1 1.3. 事件监听2 2. sen ...

  9. MYSQL数据类型 表基本操作 表记录增删改 单表查询

    一.数据类型 常用的数据类型如下: 整数:int,bit 小数:decimal 字符串:varchar,char 日期时间: date, time, datetime 枚举类型(enum) 特别说明的 ...

  10. ubuntu16.04安装网易云音乐

    源网址 对于网易,我只服云音乐,业界良心,用过的人都知道.我最喜欢的就是歌曲的评论功能,还有朋友圈子.里面有很多好段子,还有很多的好故事,基本上,不是分手,就是回忆初恋,还有吐槽的.我认为音乐带给人的 ...