题意:两只青蛙在同一纬度上(就是圆圈上)不同位置,具有不同的速度,看几次能跳的一起
解析:设经过t次调到一起,(x+m*t)mod L=(y+n*t) mod L
上式整理一下 (x+m*t)-(y+n*t)=p*L;(p是两只青蛙跳的圈数之差)
转化一下:t*(m-n)+p*L=x-y;
令a=n-m,b=L,c=gcd(a,b),d=x-y;
有a*t+b*p=d;(1)
要求的是t的最小整数解。
用扩展的欧几里德求出其中一组解t0 ,p0, 并令c = gcd(a, b);
有 a * t0 + b * p0 = c; (2)
因为c = gcd(a, b), 所以 a * t / c是整数,b * p / c 也是整数,所以 d / c 也需要是整数,否则无解。
(2)式两边都乘(d / c) 得 a * t0 *(d / c) + b * p0 * (d / c) = d;
所以t0 * (d / c)是最小的解,但有可能是负数。
因为a * ( t0 *(d / c) + b*n) + b * (p0 * (d / c) – a*n) = d; (n是自然数)
所以解为 (t0 * (d / c) % b + b) % b;
#include<stdio.h>
#include<iostream>
using namespace std;
long long t,p,c;
void ojilide(long long a,long long b)
{
if(b==0)
{
t=1;
p=0;
c=a;
}
else
{
ojilide(b,a%b);
long temp=t;
t=p;
p=temp-a/b*p;
}
}
int main()
{
long long ok=0,x,y,m,n,l,a,d,b;
cin>>x>>y>>m>>n>>l;
if(n==m)
ok=1;
else
{
a=n-m;
d=x-y;
b=l;
ojilide(a,b);
if(d%c!=0)
ok=1;
}
if(ok)
cout<<"Impossible"<<endl;
else
{
//b=b/c;
d=d/c;
long long v=d*t;
cout<<(v%b+b)%b<<endl;
}
}