题意:两只青蛙在圆圈上追赶,圆圈我们可以看作是一条首尾相接的数轴。设青蛙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;
}