P1516 青蛙的约会 [exgcd]
P1516 青蛙的约会
题意:在一个长为\(l\)的环上面有两只青蛙,一只出发点为\(x\),一次跳\(m\),另一只出发点为\(y\),一次跳\(n\),求相遇时间。
这个长为\(l\)的环不难想到了以\(l\)为模的同余。其实就是求这个\(t\):\(x+t\times m \equiv y + t \times n\pmod l\)
把这个变成普通式子:\(x - y + t(m - n) = k \times l\)
整理一下:\(t \times (m-n) - k \times l = y - x\)
这是一个二元不定方程,也就很自然地想到了另一个式子:\(t' \times (m-n) - k' \times l = gcd(m - n, l)\)
用肥鼠定理可以判断无解。套exgcd模板可以求出\(t'\)和\(k'\)。
上面两个式子如果有解的话一定是倍数关系的,所以有这么一个式子:\(\frac{gcd(m-n,l)}{y-x} = \frac{t'}{t}\),即\(t=\frac{t'(y-x)}{gcd(m-n,l)}\)。
但是\(t\)可能是负数,我们需要调整\(t\)为最小正整数解。
使用exgcd的通解公式:\(x=x_0+k\times \frac{b}{gcd(a,b)}\)。把里面的式子换成这道题的就行了。
有个需要注意的:
\(gcd\)是不支持负数的,所以这个\(y-x\)要确保为正,当这个\(y-x\)为负时,同时给\(m-n\)和\(y-x\)添负号。
代码:
#include<bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
#define ll long longll exgcd(ll a, ll b, ll &x, ll &y) {if(b == 0) {x = 1; y = 0; return a;} else {ll ret = exgcd(b, a % b, x, y);ll t = x;x = y;y = t - a / b * y;return ret;}
}
int main() {ll x, y, m, n, l; cin >> x >> y >> m >> n >> l;// x + m * t === y + n * t (mod l)// x - y + t * (m - n) = k * l// t * (m - n) - k * l = y - xll A = m - n, B = l, C = y - x;if(A < 0) {A = -A; C = -C;}ll g = exgcd(A, B, x, y);if(C % g) {cout << "Impossible" << endl;return 0;}x = x * C / g;// C : g = t : xll bg = B / g;if(bg < 0) bg = -bg;x = (x % bg + bg) % bg;cout << x << endl;return 0;
}
转载于:https://www.cnblogs.com/Garen-Wang/p/10403366.html
P1516 青蛙的约会 [exgcd]相关推荐
- POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...
- 数论:扩展欧几里德(洛谷P1516 青蛙的约会)
欧几里德 基本思想:gcd(q,r)=gcd(r,q%r); 证明,设q.r的最大公因数为a,则q=xa,r=ya,xy互质 不妨设x>y(显然如果小于会在一次gcd运算后交换) 则q%r=(x ...
- P1516 青蛙的约会
传送门 根据题意可以列出方程: 设走了X步,已经绕了维度线Y圈 那么 nX-mX=LY+(x-y) 稍微转换一下: (n-m)X - LY = x-y 如果设 A=n-m,B=-L,C=x-y ...
- 洛谷 P1516 青蛙的约会
https://www.luogu.org/problemnew/show/P1516#sub 题意还是非常好理解的..... 假如这不是一道环形的跑道而是一条直线,你会怎样做呢? 如果是我就会列一个 ...
- 青蛙的约会(poj 1061)exgcd基础题
青蛙的约会 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问 ...
- 【洛谷P1516】青蛙的约会
青蛙的约会 题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情 ...
- 数学--数论--POJ 1061青蛙的约会 (扩展欧几里得算法)
青蛙的约会 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问 ...
- POJ1061 青蛙的约会【扩展欧几里得算法】
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 126746 Accepted: 27392 Descript ...
- poj 1061青蛙的约会
青蛙的约会 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问 ...
最新文章
- bash中case的用法
- Datawhale入选DataFountain优秀组织
- Linux Kernel TCP/IP Stack — L1 Layer — Physical NIC
- boost::sort模块实现整数排序测试
- linux查看文件的编码格式的方法 set fileencoding
- Cow Contest【最短路-floyd】
- 从经理的角度看领域设计
- 1b8c语言,C语言 - 王朝网络 - wangchao.net.cn
- 编写Javascript时的注意事项
- javascript代码
- Windows下Node.js安装及环境配置
- 2021年6月20日 是第111个父亲节,祝福所有的父亲节日快乐
- 编译Android源码:Exception in thread main java.lang.UnsupportedClassVersionError:报错解决
- 单片机lcm显示字符程序C语言,手把手教你学单片机的C语言程序设计(十六).pdf...
- PPT——快速制作图表(快速插入)
- html给文字添加阴影效果,如何设置样式之添加文字阴影、边框阴影或者添加自己的CSS...
- Android读取RAM,ROM,SD卡容量
- 苹果微信分身版ios_苹果iOS系统的设备怎样安装两个微信
- 使用potplayer播放器看直播
- git-rebasegit-squash