• [POJ 1061]青蛙的约会


    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"

    Sample Input

    1 2 3 4 5

    Sample Output

    4

    题解

    我们容易列出方程:

    $m*t-n*t=k*l+y-x$,其中$t$表示时刻,$k$表示走过$k$圈。

    我们提出$t$,$k$:$(m-n)*t-l*k=y-x$。

    用$exgcd$求出一组解后,再找到t的最小正整数解。

     1 //It is made by Awson on 2017.10.7
     2 #include <map>
     3 #include <set>
     4 #include <cmath>
     5 #include <ctime>
     6 #include <queue>
     7 #include <stack>
     8 #include <vector>
     9 #include <cstdio>
    10 #include <string>
    11 #include <cstdlib>
    12 #include <cstring>
    13 #include <iostream>
    14 #include <algorithm>
    15 #define LL long long
    16 #define Max(a, b) ((a) > (b) ? (a) : (b))
    17 #define Min(a, b) ((a) < (b) ? (a) : (b))
    18 using namespace std;
    19 
    20 LL x, y, m, n, l;
    21 
    22 LL exgcd(LL a, LL b, LL &x, LL &y) {
    23   if (b == 0) {
    24     x = 1; y = 0;
    25     return a;
    26   }
    27   LL c = exgcd(b, a%b, x, y);
    28   LL t = x;
    29   x = y;
    30   y = t-a/b*y;
    31   return c;
    32 }
    33 void work() {
    34   scanf("%lld%lld%lld%lld%lld", &x, &y, &m, &n, &l);
    35   LL ta = m-n, tb = l, tc = y-x, t, k;
    36   LL gcd = exgcd(ta, tb, t, k);
    37   if (tc%gcd) printf("Impossible
    ");
    38   else {
    39     t *= tc/gcd;
    40     LL tmp = tb/gcd;
    41     if (tmp < 0) tmp = -tmp;
    42     printf("%lld
    ", (t%tmp+tmp)%tmp);
    43   }
    44 }
    45 int main() {
    46   work();
    47   return 0;
    48 }
  • 相关阅读:
    FreeMarker常用语法学习
    Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作-------sql方式
    Oracle Partition 分区详细总结
    oracle 当中,(+)是什么意思
    SQL中EXISTS的用法
    JS return false 与 return true
    Merge into语句用法及其效率问题
    几种设置表单元素中文本输入框不可编辑的方法
    Oracle存储过程基本语法
    UNIX网络编程——Socket粘包问题
  • 原文地址:https://www.cnblogs.com/NaVi-Awson/p/7634880.html
Copyright © 2020-2023  润新知