题目链接:

https://cn.vjudge.net/problem/POJ-1061

题目大意:

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。

解题思路:

假设t时刻相遇

有:(x + mt) = (y + nt) (mod L)

也就是 x + mt - y - nt  = K * L

(m - n) * t + K * L = y - x

(因为K取任意整数,移到方程左端可以不管他的正负,反正对求出的K不处理)

也就是:a * t + b * K = y - x   a = m - n   b = L 求解t和K

特判 a = 0 的时候 x = y解为0,反之无解

当a < 0时,标记一下,然后a取正数,最后求出的t再取一下相反数即可

对于ax + by = c的求解

先求解ax + by = gcd(a, b) 求出x0,y0

如果gcd(x, y)整除c则有解,反之无解

根据x0 y0可得到一解:

x1 = x0 * c / gcd(a, b)

y1 = y0 * c / gcd(a, b)

所有解:

x = x1 + b / gcd(a, b) * t

y = y1 + a / gcd(a, b) * t

最小正数x的解

b` = b / gcd(a, b)

a` = a / gcd(a, b)

x2 = ((x1 % b`) + b`) % b`

y2 根据x2计算出来

同理可求出最小正数y的解

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. using namespace std;
  5. typedef long long ll;
  6. ll extgcd(ll a, ll b, ll&x, ll&y)//ax+by = gcd(a, b)的解。返回值为gcd
  7. {
  8. ll d = a;
  9. if(b)
  10. {
  11. d = extgcd(b, a % b, y, x);
  12. y -= (a / b) * x;
  13. }
  14. else x = , y = ;
  15. return d;
  16. }
  17. int main()
  18. {
  19. ll x, y, m, n, l;
  20. cin >> x >> y >> m >> n >> l;
  21. ll xx, yy;
  22. ll a = m - n, b = l;
  23. if(a == )
  24. {
  25. if(x == y)cout<<""<<endl;
  26. else cout<<"Impossible"<<endl;
  27. return ;
  28. }
  29. bool flag = ;
  30. if(a < )a = -a, flag = ;
  31. ll g = extgcd(a, b, xx, yy);
  32. if((y - x) % g)cout<<"Impossible"<<endl;
  33. else
  34. {
  35. xx = xx * (y - x) / g;
  36. if(flag)xx = -xx;
  37. l = l / g;
  38. xx = ((xx % l) + l) % l;
  39. cout<<xx<<endl;
  40. }
  41. return ;
  42. }

POJ-1061 青蛙的约会---扩展欧几里得算法的更多相关文章

  1. 解题报告:poj1061 青蛙的约会 - 扩展欧几里得算法

    青蛙的约会 writer:pprp Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119716 Accepted: 25238 ...

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

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

  3. poj 1061 青蛙的约会 (扩展欧几里得模板)

    青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status ...

  4. POJ 1061 青蛙的约会(扩展GCD求模线性方程)

    题目地址:POJ 1061 扩展GCD好难懂.. 看了半天.最终把证明什么的都看明确了. .推荐一篇博客吧(戳这里),讲的真心不错.. 直接上代码: #include <iostream> ...

  5. POJ 1061 青蛙的约会 扩展欧几里德--解不定方程

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 81606   Accepted: 14116 Descripti ...

  6. poj 1061 青蛙的约会 扩展欧几里德

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K       Description 两 只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们 ...

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

    手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn.net/suncongbo/article/details/79382991 题目链接: (p ...

  8. poj 1061 青蛙的约会(扩展gcd)

    题目链接 题意:两只青蛙从数轴正方向跑,给出各自所在位置, 和数轴长度,和各自一次跳跃的步数,问最少多少步能相遇. 分析:(x+m*t) - (y+n*t) = p * L;(t是跳的次数,L是a青蛙 ...

  9. POJ - 1061 青蛙的约会 扩展欧几里得 + (贝祖公式)最小正整数解

    题意: 青蛙 A 和 青蛙 B ,在同一纬度按照相同方向跳跃相同步数,A的起点为X ,每一步距离为m,B的起点为Y,每一步距离为 n,一圈的长度为L,求最小跳跃步数. 思路: 一开始按照追击问题来写, ...

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

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

随机推荐

  1. 远程连接postgresql和redis设置

    1. 让Postgresql服务器被远程访问 1.1 编辑 pg_hba.conf,配置用户的访问权限 vi /etc/postgresql/8.4/main/pg_hba.conf 增加设置项 ho ...

  2. Mac新手问题

    [现象:]MAC下checkout代码时,报svn:E170013-unable to connect to a repository at url xxx, svn:E1700113: unable ...

  3. 虚拟机非正常关闭,里面的服务器重启报错:Error, some other host already uses address

    解决办法: vi /etc/sysconfig/network-scripts/ifup-eth ###########注销下面的三行内容############ # if ! /sbin/arpin ...

  4. Table Code

    post.PostToTags.Where(t => tagArray.Contains(t.PostTag.Name, comparerWihtoutCases) && !t. ...

  5. 了解:C#三维数组和锯齿数值

    此文章,只需了解,用到的不多. string[,,] three = new string[2, 3, 5];  //定义一个三维数组,给数组分别辅助2,3,5 对此数组的解释://有2个二维数组,每 ...

  6. 2.VS2012为创建的类添加注释的模板

    在项目中给类添加注释的优点: 1.方便查看这个类是为了那些功能 2.是成员小组中的谁负责编写的 根据自己的vs的安装路径找到类模板的位置:D:\Program Files (x86)\Microsof ...

  7. python apscheduler的使用

    from apscheduler.schedulers.blocking import BlockingSchedulerfrom datetime import datetime def my_jo ...

  8. mysql 的用法

    SELECT CASEWHEN    //当count(userId) = 0的时候 让其为null 不然报警告 // count(DISTINCT userId) 不用处理 count(userId ...

  9. spring cglib 与 jdk 动态代理

    1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的clas ...

  10. 医药箱APP静态小项目

    花费了10天时间,纯手写一个医药箱APP静态小项目,里面有上拉加载.左右滑动.弹出层淡入淡出等效果,主要是练习. 以下是一部分页面效果图: 我用的是谷歌的开发者工具的手机端模拟器. 里面需要优化的地方 ...