<span style="font-size:12px;">这是一道数论的问题。主要用到欧几里德算法的扩展,下面是欧几里德算法拓展的应用中的三条定理</span>
定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。
定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。
定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。
题意是:有两个青蛙要约会见面,它们在同一条纬度上,它们跳一次所用的时间也是相同的我们设其为t,则x+mt是青蛙A从坐标原点到终点所走的距离,y+nt是B走的距离,要想碰面,则他们相减一定是地面周长的整数倍,设为k*L;则:(x+mt)-(y+nt)=kl;变形得:(m-n)t-(y-x)=kL;即有(m-n)t mod L=y-x;为线性同余方程。此方程有解当且仅当y-x能被m-n和L的最大公约数(记为gcd(m-n,L)),即gcd(m-n,L)|y-x。这时,如果x0是方程的一个解,即当t=x0时,(m-n)t mod L=y-x成立,那么所有的解可以表示为:
{x0+k(L/gcd(m-n,L))|(k∈整数)}。
下面是欧几里得的模板
int exGcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int r = exGcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return r;
}
本题的代码
#include<stdio.h>
__int64 exgcd(__int64 a, __int64 b, __int64 &x, __int64 &y)
{
__int64 r, t;
if(b==0)
{
x=1;
y=0;
return a;
}
r=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-a/b*y;
return r;
}
int main()
{
__int64 x,y,m,n,l,xx,yy,d,r;
scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l);
d=exgcd(n-m,l,xx,yy);
if((x-y)%d!=0)
printf("Impossible\n");
else
{
xx=xx*((x-y)/d);
r=l/d;
xx=(xx%r+r)%r;
printf("%Id\n",xx);
}
return 0;
}