POJ 1061 青蛙的约会(初遇扩展gcd--解最小正整数解)
来源:互联网 发布:解说词配音软件 编辑:程序博客网 时间:2024/06/02 06:25
青蛙的约会
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 94253 Accepted: 17425
Description
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
我们把这两只青蛙分别叫做青蛙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
思路:很容易列出不定方程:p*(n-m)+q*L = x-y
由数论知识知:当x-y不能被gcd(L,n-m)整除时无解
可以拓展欧几里德
解p*(n-m)+q*L = gcd(L,n-m)的整数p与q
再把整数p,q乘上(x-y)/gcd(L,n-m)即是原方程的一组解
但题意说要求得p的最小正整数解,由数学知通解为p=(p*) + K*(L/gcd(L,n-m))
找到第一个大于0的解即可
//132K0MSC++925B#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;typedef long long ll;ll x,y,m,n,L;ll ext_gcd(ll a,ll b,ll &x,ll &y){ ll ans; if(b==0) { ans=a; x=1;y=0; } else { ans=ext_gcd(b,a%b,y,x); y-=(a/b)*x; } return ans;}int main(){ while(~scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)) { ll p,q; ll dx=x-y; ll dl=n-m; if(dl<0) //在步是为了修补ext_gcd的一个缺点,在文末加以解释 { dl=-dl; dx=-dx; } ll gcd=ext_gcd(dl,L,p,q); if(dx%gcd) puts("Impossible"); else { ll ans=p*(dx/gcd); ll t=L/gcd; printf("%I64d\n",(ans%t+t)%t); } } return 0;}
最坑的就是计算机取模遇到正负问题会头疼
比如3 %-4=3 -3%4=-3
这样就会导致求gcd的时候出现奇怪的正负
gcd(3,-4)= -1 gcd(-3,4)=1;
这还好办,不管怎样最大公约数取正,取绝对值就可以了
但是在拓展欧几里德中就不好解决了
比如想去解p*3+q*(-4)=gcd(3,-4)的方程的一组解
还原成数学是准备去解p*3+q*(-4)=1的解但用了拓展欧几里德实际上解出的p,q是p*3+q*(-4)=-1的解
这就没办了...同样在本题中也会出现这种情况,我的解决方法是:保证ext_gcd()的前两个参数均为正数,即把原不定方程两端乘-1即可
很多ac的程序就会遇到这种bug,比如这篇比较好的题解的代码就存在这样的bug
http://www.cnblogs.com/comeon4mydream/archive/2011/07/18/2109060.html
比如把样例的m,n , x,y 对调2 1 4 3 5这组中就会输出-1,而答案其实是4
0 0
- POJ 1061 青蛙的约会(初遇扩展gcd--解最小正整数解)
- POJ 1061 青蛙的约会 (扩展GCD)
- POJ 1061 青蛙的约会 【扩展GCD】
- poj-1061青蛙的约会 扩展GCD
- poj 1061 青蛙的约会 扩展gcd
- poj 1060---青蛙的约会 【扩展GCD】
- poj 1061 青蛙的约会 扩展gcd的简单应用
- poj 1061 青蛙的约会 (扩展gcd, 模线性方程)
- poj 1061 青蛙的约会(扩展gcd)
- poj 1061 青蛙的约会 数论扩展GCD
- poj 1061 青蛙的约会(扩展gcd)
- 1061 青蛙的约会 数论 扩展GCD
- poj 1061 青蛙的约会(扩展欧几里得解不定方程)
- poj 1061-青蛙的约会-拓展gcd
- 扩展欧几里得求最小非负整数解 (POJ 1061 青蛙约会为例)
- POJ 1061 青蛙的约会 扩展欧几里得
- poj 1061 青蛙的约会 扩展欧几里得
- poj 1061青蛙的约会(扩展欧几里得)
- (拓扑排序)poj2367,Genealogical tree
- javaNIO操作
- Ubuntu 安装oracle
- android开发 - JSON解析
- 将 .NET 任务作为 WinRT 异步操作公开
- POJ 1061 青蛙的约会(初遇扩展gcd--解最小正整数解)
- centos6.6 x86_64 install virtualbox 增强功能和ulipad
- android开发 - ListView
- VS2010建Win32 API程序
- Camera 图像处理原理分析- 抗噪 变焦 频闪 等
- LightOJ 1047 Neighbor House (线性dp 类数字三角形)
- c++实现链栈
- POJ 1426 Find The Multiple(BFS 同余模定理)
- 用动态规划解决二叉查找树