1. 程式人生 > >bzoj 1477 青蛙的約會 拓展歐幾里得(詳細解析)

bzoj 1477 青蛙的約會 拓展歐幾里得(詳細解析)

大水題:
題目戳這裡:http://www.lydsy.com/JudgeOnline/problem.php?id=1477
這道題我們分析在一個數軸上有兩隻青蛙,這個數軸是首尾交接的,所以可以一直圍著它走,顯然我們可以列出一個方程來。設它們走了t步,和他們追擊了k圈,也就是圍著又走了k圈。
所以 x + m * t = y + n * t + k * L。
我們轉換一下方程:
x - y = (n - m) * t + L * k
所以它是形如ax+by=c這種形式,我們直接用歐幾里得求出一組解輸出最小正解就好了。
AC程式碼:

#include <iostream>
#define dnt long long using namespace std; dnt x, y; dnt a, b, m, n, L; dnt Exgcd( dnt a, dnt b, dnt &x, dnt &y ) { if ( b == 0 ) { x = 1; y = 0; return a; } dnt d = Exgcd(b, a%b, x, y), temp = x; x = y; y = temp-a/b*y; return d; } dnt solv( dnt a, dnt b, dnt c ) { dnt d = Exgcd(a, b, x, y); if
( c % d ) return -1; x = x * c / d; y = y * c / d; x = (x % b + b) % b; return x; } int main() { cin >> a >> b >> m >> n >> L; if ( solv(n-m, L, a-b) != -1 ) cout << solv(n-m, L, a-b) << endl; else cout << "Impossible" << endl; return
0; }