设两只青蛙跳了t步,则此时A的坐标:x+mt,B的坐标:y+nt。要使的他们在同一点,则要满足: x+mt - (y+nt) = kL (p是整数)

化成: (n-m)t + kL = x-y (L > 0)  则变成求解同余方程: (n-m)t ≡ (x-y) mod L  ,用扩展gcd解决。 且此时当 (x-y) % gcd(n-m,L) == 0 时才有解。

解同余方程ax+by = m时,假设我们已经求出了一对x0,y0,则 x0 = x*m/gcd(a,b) ,此时x0可能不是正整数,更不一定是最小正整数解,所以还需进一步处理。

令g = gcd(a,b), 对 a*x0 + b*y0 = d , 有 (a/g)*x0 +(b/g)*y0 = d/g 再变形:(a/g)(x0 + k*(b/g)) + (b/g)(y0 - k*(a/g)) = d/g 仍然成立,根据k的值可以找出所有的解,所以,x = x0+k(b/g) , 令b/g = t, 则 x = x0 + kt, 所以可以通过 x = (x0%t + t)%t 求得最小正整数解x。

Tips:为了避免gcd(n-m,L)变成负数,首先判断一下n-m的正负性,如果为负,则n-m取反成m-n,此时x-y取反成y-x,仍可求得正确结果。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
#define SMod 10007
#define lll __int64
#define ll long long
using namespace std;
#define N 1000007ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x = (ll)1,y = (ll)0;return a;}ll r = exgcd(b,a%b,x,y);ll t = x;x = y;y = t - a/b*y;return r;
}ll gcd(ll a,ll b)
{if(!b)return a;return gcd(b,a%b);
}int main()
{ll x,y,m,n,L;ll kx,ky;//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L)!=EOF){ll nm = n-m;ll delta = x-y;if(nm < 0){nm = m-n;delta = y-x;}ll d = exgcd(nm,L,kx,ky);if(delta%d){puts("Impossible");continue;}ll t = L/d;//printf("%lld\n",t);ll res = (((delta/d)*kx)%t + t)%t;printf("%lld\n",res);}return 0;
}

View Code

转载于:https://www.cnblogs.com/whatbeg/p/3813531.html

UESTC 288 青蛙的约会 扩展GCD相关推荐

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

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

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

    POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...

  3. [BZOJ1477] 青蛙的约会|扩展欧几里得算法

    1477: 青蛙的约会 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 306  Solved: 192 [Submit][Status][Discuss ...

  4. POJ 1061 青蛙的约会 (扩展欧几里得)

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

  5. JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论

    http://172.20.6.3/Problem_Show.asp?id=1371 题意是两个青蛙朝同一个方向跳 http://www.cnblogs.com/jackge/archive/2013 ...

  6. POJ - 1061 青蛙的约会(扩展欧几里得)

    题目链接:点击查看 题目大意:两只青蛙在一个单向循环数轴上跳动,给出初始位置和每秒跳动的距离以及数轴长度,问是否可以相遇,若能相遇求出最小时间 题目分析:自从第一次接触扩展欧几里得以来已经有半年时间了 ...

  7. 青蛙的约会(POJ 1061 扩展欧几里德算法)

    POJ 1061 青蛙的约会 扩展欧几里德算法简单介绍及应用 题目大意: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳, ...

  8. 集训笔记---扩展欧几里德算法(POJ NO.1061 青蛙的约会 有点烦人小跳蛙gcd)

    又在搬砖,本来以为这是一个追及问题,后来发现数据好像并不是那么个意思,后来把方程列出来,经过一个去模的操作,我们其实可以找到一点线索,那就是,一个经过变形的二元一次方程,那么在这种情况下,就可以利用扩 ...

  9. POJ 1061 青蛙的约会(扩展欧几里得)

                                                                   青蛙的约会 Time Limit: 1000MS   Memory Lim ...

最新文章

  1. 5g的八大关键指标_你对5G技术标准了解多少(干货)
  2. 深度系统linux deepin如何按装,U盘快速安装深度操作系统Deepin详细过程 体验不一样的桌面系统...
  3. chap单向认证客户端
  4. java增删改查_Java程序员你真的甘心只做增删改查吗
  5. 单元测试Java Hadoop作业
  6. 常见的蓝牙4.0模块
  7. strcpy和strcat
  8. 一些诗作-2015年
  9. “21天好习惯“第一期-5
  10. window eclipse快速导入svn项目以及软件汉化
  11. CAD/CASS城市坐标转换到CGCS2000(不涉及参数计算)
  12. 李子奈计量经济学笔记和课后习题答案
  13. Hadoop—数据仓库分层介绍
  14. mysql awr报告怎么看,OracleAWR报告查看分析
  15. m序列的产生原理及其性质
  16. 2、异常值(outliers)检测:业务法、Z-score、3σ准则、箱线图
  17. 华东交通大学2018年ACM双基程序设计大赛题解
  18. inner join 和 outer join 的区别
  19. 浅谈:支付结算系统的重要性
  20. 关机提示错误(已解决) 0x0074006e指令引用的0x0074006e内存不为read

热门文章

  1. matlab一致性检验程序,一致性检验的源程序.doc
  2. python最小二乘法求a b_python_numpy实用的最小二乘法理解
  3. python切片操作 当所有数据都省略时_python疑难问题---13、Python切片操作
  4. leetcode —— 209. 长度最小的子数组
  5. leetcode - 96. 不同的二叉搜索树
  6. Windows下Squid 3.5安装及配置代理服务器
  7. 传统手工特征深度特征【转载】
  8. MyBatis框架 多表联合查询实现
  9. DenseNet——CNN经典网络模型详解(pytorch实现)
  10. The Use Case Definition in UML