http://poj.org/problem?id=1061
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個整數s,t,p,q,L,其中s≠t < 2000000000,0 < p、q < 2000000000,0 < L < 2100000000。
(變量名和原題不同請注意)
Output
輸出碰面所需要的跳躍次數,如果永遠不可能碰面則輸出一行"Impossible"
Sample Input
1 2 3 4 5
Sample Output
4
設x為最終結果,則我們能列出式子:
(p - q)x = t - s (mod L)
顯然該式可以轉化為:
(p - q)x + Ly = t - s
再變換一下變成:
ax + by = c
變成了熟悉的exgcd問題,正常求解即可。
#include<cstdio> #include<cctype> #include<iostream> using namespace std; typedef long long ll; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a; } void exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1;y=0;return;}exgcd(b,a%b,x,y);ll temp;temp=x;x=y;y=temp-(a/b)*y;return; } int main(){ll s,t,p,q,l;cin>>s>>t>>p>>q>>l;ll a=(p-q+l)%l,b=l,c=(t-s+l)%l,g=gcd(a,b);if(c%g){puts("Impossible");return 0;}a/=g;b/=g;c/=g;ll x,y;exgcd(a,b,x,y);x=(x%b+b)%b;x=x*c%b;cout<<x;return 0; }
?