1 条题解
-
0
自动搬运
来自洛谷,原作者为

皎月半洒花
在那之前,你要多想。搬运于
2025-08-24 21:25:58,当前版本为作者最后更新于2018-04-12 21:57:13,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这是一篇有详细证明的题解 ~
首先我们可以发现,这个题就是为了让我们解一个方程:
其中 为所求。
让我们把这个看上去很 zz 的方程变化一下:
那么就是:
$$\begin{aligned} x-y+k(m-n)-lz&=0\\ k(m-n)-lz&=-(x-y) \end{aligned} $$我们设 (注意这个地方有变号,即 被我设作 ,为的是让等式右边的 冠正号)。
这个式子便可写作:
诶,这不就是一个不定方程吗?
对啊,所以我们所要做的就是对这个不定方程求出最小解。
那么其实,对于这个方程,我们是要解出步数的最小值,所以我们只需要求出最小即可。我们可以通过扩展欧几里德算法求出一组特解,然后对于这组特解,我们再推导出最小解来。
但由于这个方程在解 的时候,那个方程转化成了:
那么我们求出的 就是这个方程得一个特解。
之后,这个方程的所有解就可以表示成
这是上面这个式子为什么可以这么做的证明:
若有 且 。
那么便有 。
两边同时除以 可得
$$\frac{a}{gcd(a,b)}(x-x_0)=-\frac{b}{gcd(a,b)}(y-y_0)\quad (1) $$而因为
所以由 可得 整除 。
所以很显然有
$$\frac{b}{gcd(a,b)}\times{t}={(x-x_0)},t \in \mathbb{Z} $$那么就有对于任意一个 ,有
让我们回到原问题。因为
这个方程对于 而言,想要通过一个特解推出最小解,可以如此做:
而因为这个 是建立在 得出的方程上的,方程右边是 而不是 。所以最后我们需要将结果 。
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);//处理负数 }
- 1
信息
- ID
- 509
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者