思路
因为两个青蛙同时跳到同一个点上才算碰面,设 t t t 为跳的次数, p p p 为两个青蛙跳的圈数之差,有如下式子:
( x + m × t ) − ( y + n × t ) = p × L (x+m \times t ) - ( y+n \times t ) = p \times L (x+m×t)−(y+n×t)=p×L
整理得:
( n − m ) × t + L × p = x − y (n-m) \times t + L \times p = x - y (n−m)×t+L×p=x−y
首先,要判断 gcd ( n − m , L ) ∤ x − y \gcd ( n-m , L ) \nmid x-y gcd(n−m,L)∤x−y 的情况。
然后,直接套拓展欧几里得算法,求出 ( n − m ) × t + L × p = gcd ( n − m , L ) (n-m) \times t + L \times p = \gcd ( n-m , L ) (n−m)×t+L×p=gcd(n−m,L) 一组解 t 0 , p 0 , g c d = gcd ( n − m , L ) t_0 \text{ , } p_0 \text{ , } gcd= \gcd ( n-m , L ) t0 , p0 , gcd=gcd(n−m,L) 。
特解:求 x x x 的最小正整数解,即 t = b / gcd ( a , b ) , x = ( x m o d t + t ) m o d t t = b / \gcd(a,b) \text{ , } x= ( x \bmod t + t ) \bmod t t=b/gcd(a,b) , x=(xmodt+t)modt
带入特解(本题求的是 t t t 的最小解),求出 ( n − m ) × t + L × p = gcd ( n − m , L ) (n-m) \times t + L \times p = \gcd ( n-m , L ) (n−m)×t+L×p=gcd(n−m,L) 中 t 0 t_0 t0 的最小解 t ′ t' t′
t ′ = ( t 0 m o d L g c d + L g c d ) m o d L g c d t'= ( t_0 \bmod \dfrac{L}{gcd} + \dfrac{L}{gcd} ) \bmod \dfrac{L}{gcd} t′=(t0modgcdL+gcdL)modgcdL
有
t = t ′ × x − y g c d t = t' \times \dfrac{x - y}{gcd} t=t′×gcdx−y
所以
t = ( x − y g c d × t 0 m o d L g c d + L g c d ) m o d L g c d t=(\dfrac{x - y}{gcd} \times t_0 \bmod \dfrac{L}{gcd} + \dfrac{L}{gcd} ) \bmod \dfrac{L}{gcd} t=(gcdx−y×t0modgcdL+gcdL)modgcdL
C o d e Code Code
#define int long long
signed main()
{
int x,y,m,n,l;
int X,Y,gcd;
cin>>x>>y>>m>>n>>l;
int A=x-y,B=n-m;
if(B<0)//注意取反!!!
{
B=-B;
A=-A;
}
if(A%(gcd=exgcd(B,l,X,Y))!=0)
cout<<"Impossible"<<endl;
else
cout<<( A/gcd * X % (l/gcd) + (l/gcd) ) % (l/gcd)<<endl;
}