POJ 1061 青蛙的約會

2022-09-07 09:18:08 字數 1263 閱讀 1798

題意:有兩隻青蛙,在l那麼長的環上,起點分別為x, y,一次跳躍的長度分別為m,n,問幾次跳躍後他們能相遇,如不能相遇輸出"impossible"。

解法:同餘問題+擴充套件歐幾里得。從題意容易推出以下式子:

設跳躍次數為t,mt + x ≡ nt + y (mod l) (1)。

根據同餘的性質:當a ≡ b (mod c)時,(a - b) % c = 0。

則式(1)轉化成(m - n)t + x - y = pl(p ∈ n)。

問題變為解二元一次方程ax + by = c最小可行解問題。

解決這類問題的演算法是擴充套件歐幾里得演算法:對於不完全為0的非負整數a,b,gcd(a, b)表示a,b的最大公約數,必然存在整數對x,y,使得gcd(a,b) = ax + by。

對於本題當c不能整除gcd(a, b)的時候說明無解,應輸出"impossible"。

**如下:

int exgcd(ll a, ll b, ll &x, ll &y)

int r = exgcd(b, a % b, x, y);

int t = x;

x = y;

y = t - a / b * y;

return r;

}

當c能整除gcd(a, b)時,通過擴充套件歐幾里得演算法求出ax + by = gcd(a, b)的解x時,ax + by = c的最小解則為x * (c / gcd(a, b)),由於x可能為負數,所以最終答案應為(x % gcd(a, b) + gcd(a, b)) % gcd(a, b)。

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

ll exgcd(ll a, ll b, ll &x, ll &y)

ll r = exgcd(b, a % b, x, y);

ll t = x;

x = y;

y = t - a / b * y;

return r;

}int main()

x *= c / r;

ll r = b / r;

ll ans = (x % r + r) % r;

cout << ans << endl;

}return 0;

}

POJ 1061 青蛙的約會

poj 1061 青蛙的約會.description 兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,於是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特徵,也沒有約定見面的具體位置。不過青蛙們都是很...

POJ 1061 青蛙的約會

兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,於是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特徵,也沒有約定見面的具體位置。不過青蛙們都是很樂觀的,它們覺得只要一直朝著某個方向跳下去,總能碰到對...

poj1061青蛙的約會(擴充套件歐幾里得)

啊哈哈,點我點我 題目 青蛙的約會 time limit 1000ms memory limit 10000k total submissions 90518 accepted 16492 description 兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在...