https://vjudge.net/contest/242514#problem/G
初始位移差为:x-y;速度差为:m-n;可以得到方程(m-n)*k+(x-y)=L*i(k为跳跃的次数,i为走的圈数)
------>(n-m)*k+L*i=x-y;(a*x+b*y=gcd(a,b)=c),用扩展欧几里得求:先将式子变为(n-m)*k*c/(x-y)+L*i*c/(x-y)=c;
求出解xx=k*c/(x-y),如果(x-y)%c不等于0;k就没有整数解,求出最小整数解k=(xx*d%b+b)%b(d=(x-y)/c,b=L/c)
#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<math.h>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
long long e_gcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long ans=e_gcd(b,a%b,x,y);
long long temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
int main()
{
long long x,y,m,n,l;
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l))
{
if(m==n)
printf("Impossible\n");
else
{
long long a,b,c,d,xx,yy;
a=n-m;
d=x-y;
b=l;
c=e_gcd(a,b,xx,yy);
if(d%c!=0)//无整数解
{
printf("Impossible\n");
}
else
{
b/=c;
d/=c;
long long v=xx*d;
printf("%lld\n",(v%b+b)%b);//最小整数解
}
}
}
}