1. 程式人生 > >POJ1061(擴充套件歐幾里得+同餘演算法)

POJ1061(擴充套件歐幾里得+同餘演算法)

青蛙的約會

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 129229 Accepted: 28286

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

題解:由題意可知設次數為t則:               (t*m+x)-(t*n+y)=k*l     \rightarrow t(m-n)=y-x   (mod    l)

由擴充套件歐幾里得定力得 設:   a=(m-n)     b=l     c=y-x;

則            a*x+b*y=c        (mod    l);

解得一個值x1       又有同餘定理得   t=(x*c/gcd %l/gcd +l/gcd)%l/gcd     

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define _INIT ios::sync_with_stdio(false);cin.tie(nullptr);cout.precision(10);cout<<fixed
typedef  long long ll;
/*擴充套件歐幾里得*/
ll e_gcd(ll a,ll b,ll &tx,ll &ty)
{
     if(b==0)
     {
         tx=1;
         ty=0;
         return a;
     }
     ll ans=e_gcd(b,a%b,tx,ty);
     ll tmp=tx;
     tx=ty;
     ty=tmp-a/b*ty;
     return ans;
}
int main()
{
    ll x,y,m,n,L;
    while(cin>>x>>y>>m>>n>>L)
    {
        if(m==n){cout<<"Impossible"<<endl;continue;}
        if(m<n) {swap(m,n);swap(x,y);}
        ll tx,ty,c=y-x;
        ll d=e_gcd(m-n,L,tx,ty);
        if(c%d){cout<<"Impossible"<<endl;}
        else {cout<<(	(tx*c/d)%(L/d)+(L/d))%(L/d)<<endl;}
    }
    return 0;
}