青蛙的约会(扩展欧几里得)
题意:两个青蛙,在一个圆上,这个圆的单位长度是1,圆的总长是L,现在A青蛙在位置为a的点,每次能跳va长度,B青蛙在位置为b的点,每次能跳vb长度,两只青蛙跳一次的时间相同且都顺时针跳,问它们最少能跳几次才相遇。
思路:自己推出来了个方程:
代码:
#include<cstdio>
#include<set>
#include<map>
#include<string.h>
#include<string>
#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
typedef long long LL;
using namespace std;
const int maxn=1e6+5;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0){
x=1,y=0;
return a;
}
LL ans=exgcd(b,a%b,x,y);
LL temp=x;
x=y;
y=temp-(a/b)*y;
return ans;
}
int main()
{
LL a,b,va,vb,l;
scanf("%lld%lld%lld%lld%lld",&a,&b,&va,&vb,&l);
if(va==vb){
printf("Impossible\n");
}
else {
LL x,y;
LL g=exgcd((vb-va),l,x,y);
LL c=(a-b+l);
if(c%g!=0){
printf("Impossible\n");
}
else{
LL ansx=x*(c/g);
LL t=l/g;
x=(ansx%t+t)%t;//求最小正整数解
printf("%lld\n",x);
}
}
return 0;
}