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米。现在要你求出它们跳了几次以后才会碰面。 

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
原创粉丝点击