題意:兩隻青蛙在圓圈上追趕,圓圈我們可以看作是一條首尾相接的數軸。設青蛙A的出發點座標是x,青蛙B的出發點座標是y。青蛙A一次能跳m米,青蛙B一次能跳n米,兩隻青蛙跳一次所花費的時間相同。總長L米。現在要你求出它們跳了幾次以後纔會碰面。
思路:設跳了t次以後纔會碰面,則有(x + tm) % L = (y + tn) % L,即 (x + tm) - (y + tn) = PL,整理得:(n - m) * t + PL = x - y,即ax + by = c的形式,我們用擴展歐幾里得函數求解,得到ax + by = gcd(a,b)的解(x0,y0),如果c能整除gcd(a,b)則表明該方程有解,x1 = (x0 * c / (gcd(a,b)),最小正整數解爲(x1 % (b / gcd(a,b) + b / gcd(a,b)) % (b / gcd(a,b))。
#include <stdio.h>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll& x,ll& y)
{
ll d = a;
if(b != 0) {
d = exgcd(b,a % b,y,x);
y -= (a / b) * x;
}
else {
x = 1,y = 0;
}
return d;
}
int main(void)
{
ll x,y,m,n,L;
ll a,b,c,gcd,x1,y1,t;
scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&L);
c = x - y;
a = n - m;
b = L;
gcd = exgcd(a,b,x1,y1);
if(c % gcd)
printf("Impossible\n");
else {
x1 = x1 * c / gcd;
t = b / gcd;
printf("%lld",(x1 % t + t) % t);
}
return 0;
}