[题解]P1516 青蛙的约会
实际上是一个关于\(k,s\)的不定方程:
\[x+km+sL=y+kn
\]
很容易理解,就是走了\(x\)步之后,两只青蛙相差\(s\)圈相遇。
变形得:
\[k(m-n)+sL=y-x
\]
有解\(\iff \gcd(m-n,l) \mid y-x\)。
exGCD先解决\(k(m-n)+sL=\gcd(m-n,l)\),再将\(k,s\)同乘\(\frac{y-x}{\gcd(m-n,l)}\)即可。
由于\(m-n\)可能存在负数,此时我们将\(x,y\)和\(m,n\)分别swap一下即可。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,m,n,l,k,s,g;
int exgcd(int a,int b,int& x,int& y){
int d;
if(b==0) x=1,y=0,d=a;
else d=exgcd(b,a%b,y,x),y-=a/b*x;
return d;
}
signed main(){
cin>>x>>y>>m>>n>>l;
if(m<n) swap(n,m),swap(x,y);
g=exgcd(m-n,l,k,s);
if((y-x)%g) cout<<"Impossible\n";
else k*=(y-x)/g,g=l/g,k=(k%g+g)%g,cout<<k<<"\n";
return 0;
}
浙公网安备 33010602011771号