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

Posted Ritchie丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1061 青蛙的约会 (扩展欧几里得模板)相关的知识,希望对你有一定的参考价值。

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

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

公青蛙一开始在x位置,母青蛙在y位置。公青蛙每次跳m米,母青蛙每次跳n米,并且都是向右跳的。地球经线长度是L,然后地球是圆的,也就是说,跳到L、L+1、L+2……其实就是跳到0、1、2。 公青蛙想追母青蛙,问多少次后它们能跳到一起。如果它们永远不能相遇,就输出Impossible

就是求一个k,使x + k*m ≡ y + k*n (mod L) ,然后对方程化简,就变成(n-m) * k ≡ x-y (mod L)。然后这个方程其实就等价于(n-m)*k + L*s = x-y。这就是ax + by = c求整数x的模型。

要求ax + by = c的整数x解。(n-m)*t+L*S=x-y。首先,设d = gcd(a, b),方程两边除以d得到a/d * x + b/d * y = c/d,a是整除d的,b也是整除d的,而x、y都是整数解,所以要求c/d也是整数。如果c不整除d,当然就是Impossible。我们能求出ax0+by0=d的解x0和y0,那么两边乘以c/d即a(c/d * x0) + b(c/d * y0) = c,就可以得到原来方程的解x = (c/d * x0),y = (c/d * y0)。

所以x0 * (c / d)是最小的解,但有可能是负数。

因为a * ( x0 *(c / d) + b*n) + b * (y0 * (c / d ) – a*n) = c; (n是自然数)

所以解为 (x0 * (c / d) % b + b) % b; 

 

#include <iostream>
using namespace std;
typedef long long ll;
void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(!b) {d=a;x=1;y=0;}
    else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int main()
{
    ll x,y,m,n,L,X,Y,d,r;
    while(cin>>x>>y>>m>>n>>L)
    {
        gcd(n-m,L,d,X,Y);
        //d指的是每次可以让x-y的差距改变d个
        r=L/d; //走r次走整数个L 走回原点
        //因为可能结果是负数 根据等式 +b/d
        if((x-y)%d) //无法改变为0
            cout<<"Impossible"<<endl;
        else
            cout<<((x-y)/d*X%r+r)%r<<endl;
    }
    return 0;
}

 

 

 

以上是关于poj 1061 青蛙的约会 (扩展欧几里得模板)的主要内容,如果未能解决你的问题,请参考以下文章

POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解

扩展欧几里德 poj1061 青蛙的约会

POJ1061 青蛙的约会(扩展欧几里得)

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

POJ1061青蛙的约会[扩展欧几里得]

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