题目:青蛙的约会
思路:
扩展欧几里得算法求出特解,再由特解求出通解及最小值。
依题意,可列出方程(n-m)x1+Lx2=X-Y。
根据exgcd(n-m,L,x1,y1),求出特解(x1,y1),以及gcd(n-m,L)。
注意一下,当(X-Y)%gcd!=0时原方程无解。
再根据公式,最小值为(x0%t+t)%t,其中x0=x1*c/gcd,t=b/gcd。
通解公式:x=x0+bt,y=y0-at(其中t为任意整数)。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxL 2100000000
#define maxX 2000000000
#define ll long long
ll X,Y,m,n,L;
void readin() {
scanf("%lld%lld%lld%lld%lld",&X,&Y,&m,&n,&L);
}
ll exgcd(ll a,ll b,ll& x,ll& y) {
if(b==0) {
x=1,y=0;
return a;
}
ll gcd=exgcd(b,a%b,x,y);
ll t=x;
x=y,y=t-(a/b)*y;
return gcd;
}
int main() {
readin();
ll a=n-m,b=L,c=X-Y;
if(a<0) a=-a,c=-c;
ll x1=0,x2=0;
ll gcd=exgcd(a,b,x1,x2);
ll t=b/gcd;
x1=x1*c/gcd;
if(c%gcd) printf("Impossible");
else printf("%lld",(x1%t+t)%t);
return 0;
}