https://vjudge.net/problem/POJ-1061
若跳T次相遇,T次后A在x+mT ,B在y+nT 。
得 (x+mT) - (y+nT) = kL (k位任意整数)。
变形得(n-m)T + kL = x-y。
扩展欧几里德求出 (n-m)T + kL = gcd(n-m, k) 的解。
求出特解,找出最小解。
#include <iostream>
using namespace std;
#define ll long long
ll x,y,m,n,l;
ll gcd(ll a,ll b){
if (b==0){
return a;
}
return gcd(b,a%b);
}
void exgcd(ll a,ll b,ll &x,ll &y){
if (b==0){
x=1;
y=0;
return;
}
exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
}
int main(){
cin >> x >> y >> m >> n >> l;
ll a=n-m;
ll b=l;
ll c=x-y;
ll t=gcd(a,b);
if (c%t!=0){
cout << "Impossible" << endl;
}
else{
a/=t;b/=t;
ll x0,y0;
exgcd(a,b,x0,y0);//先求出a*x0+b*y0==gcd(a,b)的解
x0*=c/t; //再求出a*x0+b*y0==c的解,此时
x0=(x0%b+b)%b; //消负
if (x0==0) x0+=b;
cout << x0 << endl;
}
}