题意:中文- -
分析:设青蛙A和青蛙B跳了s步,可列出方程x+ms-Lk=y+ns,变形得(n-m)s+Lk=x-y,当(X-Y)不能整除gcd(n-m,L)时,方程无解。利用扩展欧几里德求出(n-m)s+Lk=gcd(n-m,L)的一个解s'。s'=s'*((x-y)/gcd(n-m,L)),此时的s'为原方程(n-m)s+Lk=x-y的一个特解,再求出最小解就行了。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
void exgcd(long long a,long long b,long long &d,long long &x,long long &y)
{
if(b==0)
{
d=a;
x=1;
y=0;
}
else
{
exgcd(b,a%b,d,y,x);
y=y-x*(a/b);
}
}
int main()
{
long long d,x,y,g;
long long start1,start2,m,n,L;
while(scanf("%lld%lld%lld%lld%lld",&start1,&start2,&m,&n,&L)!=EOF)
{
exgcd(n-m,L,d,x,y);
if((start1-start2)%d!=0)
printf("Impossible\n");
else
{
long long s=L/d;
x=x*((start1-start2)/d);
x=(x%s+s)%s;
printf("%lld\n",x);
}
}
return 0;
}