莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
$小青在位置\ a,速度为\ m,小蛙在位置\ b,速度为\ n,两人相距\ L,跳\ x\ 步后相遇$
$则存在\ y\ 使得\ (m-n)x+Ly=b-a$
$令\ d=exgcd(m-n,L,x,y),则\ x=x_0\cdot \dfrac{b-a}{d}$
$通解\ x=x+k\cdot \dfrac{L}{d},本题求出最小的正整数\ x\ 即可$
可参考: 扩展欧几里得算法
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b)
{
x=1,y=0;
return a;
}
LL d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
LL a,b,m,n,L;
cin>>a>>b>>m>>n>>L;
LL x,y;
LL d=exgcd(m-n,L,x,y);
//有解的前提 (b - a) % d == 0
if((b-a)%d) puts("Impossible");
else
{
x*=(b-a)/d;
LL t=abs(L/d);
cout<<(x%t+t)%t<<endl;
}
return 0;
}