#include <iostream>
#include <cstdio> //VJ上用printf scanf要加上这个库
using namespace std;
long long gcd(long long a,long long b){ //欧几里德算法
return b==0?a:gcd(b,a%b);
}
void exgcd(long long a,long long b,long long &d,long long &x,long long &y){ //扩展欧几里德算法
if(!b) {
d=a;
x=1;
y=0;
}
else{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
void jump(long long x,long long y,long long m,long long n,long long l){
long long a=n-m;
long long b=l;
long long c=x-y;
long long g=gcd(a,b);
if(c%g){
printf("%s\n","Impossible");
return;
}
long long x_=0,y_=0;
exgcd(a,b,g,x_,y_);
x_=x_*c/g;
while(x_<0) x_+=b;
x_%=b; //取最小值的话必须要取模
printf("%lld\n",x_);
}
int main(){
long long x,y,m,n,l;
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l))
jump(x,y,m,n,l);
}
经典的青蛙约会问题,主要是扩展欧几里德算法的运用。
根据题意列出方程,设青蛙跳p次相遇,总路程总共走了q圈;
x+mp-(y+np)=ql
整理得 p(n-m)+ql=x-y
令a=n-m b=l c=x-y x=p y=q
得 ax+by=c;
如果c和gcd(a,b)无关 则该方程无解(我这里也没有完全理解)
如果c和gcd(a,b)有关 我们求解ax+by=gcd(a,b) 然后将结果*c/gcd(a,b)就能得到结果;
当结果为负时加上b,同时为了取得最小值所以取模(不知道为什么要取模)
最后的x就是我们要求的相遇跳的次数了。
本文介绍了一个经典的青蛙约会问题,通过扩展欧几里德算法解决相遇次数的问题。文章详细阐述了解题思路,包括如何建立数学模型并求解方程。
1699

被折叠的 条评论
为什么被折叠?



