题解 P1516 【青蛙的约会】
这是一篇有详细证明的题解
首先我们可以发现,这个题就是为了让我们解一个方程:
其中
让我们把这个看上去很 zz 的方程变化一下:
那么就是:
我们设
这个式子便可写作:
诶,这不就是一个不定方程吗?
对啊,所以我们所要做的就是对这个不定方程求出最小解。
那么其实,对于这个方程,我们是要解出步数的最小值,所以我们只需要求出
但由于这个方程在解
那么我们求出的
之后,这个方程的所有解就可以表示成
这是上面这个式子为什么可以这么做的证明:
若有
那么便有
两边同时除以
而因为
所以由
所以很显然有
那么就有对于任意一个
让我们回到原问题。因为
这个方程对于
而因为这个
ll ans,x1,y1;
ll exgcd(ll a,ll b,ll &x1, ll &y1){
if(!b){
x1=1;
y1=0;
return a;
}
ans=exgcd(b,a%b,x1,y1);
ll t=x1;
x1=y1;
y1=t-a/b*y1;
return ans;
}
int main(){
ll n,m,x,y,l;
cin>>x>>y>>m>>n>>l;
ll b=n-m,a=x-y;
if(b<0){
b=-b;
a=-a;
}//处理负数
exgcd(b,l,x1,y1);
if(a%ans!=0)//判断方程有无解。
cout<<"Impossible";
else
cout<<((x1*(a/ans))%(l/ans)+(l/ans))%(l/ans);//处理负数
}