已知:数轴长度为 L(环形) 。青蛙1每次跳跃的步数为 m ,青蛙2每次跳跃的步数为 n ;开始时,青蛙1在 x 的位置,青蛙2在 y 的位置 。
问题: 求两只青蛙在同一时刻跳到同一地点的最小步数。
设两只青蛙的跳跃次数为 k 。
∵他们需要在同一时刻到达同一位置
∴ km+x ≡ kn+y (mod L)
km-kn ≡ y-x (mod L)
k(m-n) ≡ y-x(mod L)
其等价于 k(m-n)-(y-x) 是 L 的倍数
设 k(m-n)-(y-x) 是 L 的 -a 倍
可以将方程改写为 k(m-n)-(y-x)=-aL
k(m-n)+aL=y-x
因扩展欧几里得算法:对于任意整数 a,b,存在一对整数 x,y 满足 ax+by=gcd(a,b)
由此推得 : y-x 必须是 gcd(m-n,L) 的倍数才有最终解
在有解时,先用欧几里得算法求出一组整数解 k0,a0,满足 (m-n)*k0+L*a0=gcd(m-n,L),然后 k=k0*L/gcd(m-n,L) 即为一个解。方程的通解是所有模 L/gcd( m-n,L) 与 同余的余数
#include<bits/stdc++.h>
using namespace std;
long long X,Y,M,N,L,Ans1,Ans2;
long long gcd(long long x,long long y){ return y ? gcd(y,x%y) : x ; }
long long exgcd(long long a,long long b,long long &x,long long