青蛙的约会
思路
我们可以列出一个方程:\(x+km≡y+kn(mod\ l)\)
我们转换一下:
\(l\mid x+km-y-kn\)
\(\Rightarrow lz=x+km-y-kn\)
\(\Rightarrow -x+y=lz+km-kn\)
\(\Rightarrow -x+y=lz+k(m-n)\)
我们设\(S=-x+y,W=m-n\)
所以原式可化为\(lz+kW=S\)
我们知道\(l,W,S\),就求出\(k\)。
然后就求出最小解。
但我们使用扩展欧几里得算法的话是求出\(lz+kW=gcd(l,W)\)
所以我们要求最后结果的话,我们就要把结果\(\times\frac{S}{gcd(l,W)}\)。
代码
#include <bits/stdc++.h>
using namespace std;
long long x,y,n,m,l,t;
pair<long long,long long> gcd(long long x,long long y) {
if(!y) {
t=x;
return make_pair(1,0);
}
pair<long long,long long> ans=gcd(y,x%y);
return make_pair(ans.second,ans.first-ans.second*(x/y));
}
int main() {
scanf("%lld %lld %lld %lld %lld",&x,&y,&n,&m,&l);
long long b=m-n,a=x-y;
if(b<0) b=-b,a=-a;
pair<int,int> ans=gcd(b,l);
if(a%t!=0) printf("Impossible");
else printf("%lld",((ans.first*(a/t))%(l/t)+(l/t))%(l/t));
return 0;
}