扩欧的使用,要学会构建方程,首先要先写出等式关系出来,然后再将等式关系进行构建方程。
这道题是:
假设两只青蛙都跳了t步之后两者相遇。
则 青蛙A 的位置为x+mt ,青蛙B为 y+nt。
则 x+mt-y-nt=pL (p为圈数)
所以t*(n-m)+pL=x-y;
套入extend_gcd 既可以得到
x1(n-m)+y1L=gcd;
之后求出gcd与x-y的倍数关系。
为了防止数为负数要mod
因为扩欧等式的解满足(x0+K*b/gcd,y0-K*a/gcd); K倍数。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#define LL long long
#define bug puts("************")
using namespace std;
const int N=410;
LL extend_gcd(LL a,LL b,LL& x,LL& y){
if(a==0&&b==0) return -1;
if(b==0){
x=1;y=0;return a;
}
LL d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
LL x,y,m,n,L;
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L);
LL x1,y1;
LL d=extend_gcd(n-m,L,x1,y1);
if(d==-1||(x-y)%d){
puts("Impossible");
}
else {
//cout<<x1*(x-y)/d<<endl;
LL s=L/d;
x1=x1*(x-y)/d;
x1=(x1%s+s)%s; ///防止负数
printf("%lld\n",x1);
}
return 0;
}