Justoj Fabulous Race Between Tortoise And Rabbit 拓展欧几里得 技巧
Fabulous Race Between Tortoise And Rabbit
时间限制: 1 s 内存限制: 128 MB
提交 我的状态
题目描述
经历了上次的惨败,兔子一直心怀不满,又策划了一场比赛,但这次不再是简单的跑步比赛了,他们将在一个神奇的场地进行一次奇妙的比赛:
这个场地是线性的。它拥有一种神奇的功能,表面看起来它只有L米长,其实是无限的!——当你跑到尽头再往前行进时你会发现,你将从另一端跑出来!
兔子制定的游戏规则很简单:正方向为从右往左,兔子和乌龟同时在不同位置开始朝正方向跑,如果兔子在某一时刻与乌龟相遇(在同一个位置)那么乌龟就输,比赛结束。
乌龟沉思了一会儿,要求增加规则:即兔子和乌龟的速度在整个比赛过程中必须都是不变的。
懒惰又自大的兔子以为这次无论如何都不会输掉比赛,一心只想快点赢,想都没想随口就答应了。
现在对于给定的场地长L,兔子和乌龟的位置x和y,以及兔子和乌龟的速度v1,v2。要你判断兔子是不是会赢呢,如果兔子赢得比赛,就输出“win!”和比赛进行的时间t,如果兔子输掉了比赛,就对它发出嘲讽,输出“lueluelue”
输入
输入包括5个整数x1,y1,v1,v2,Lx1,y1,v1,v2,L其中x1≠y1,x1≤2∗109,y1≤2∗109x1≠y1,x1≤2∗109,y1≤2∗109
0<v1,v2≤2∗109,0<L≤2∗1090<v1,v2≤2∗109,0<L≤2∗109
输出
如果兔子赢得比赛,就在一行输出“win!”,下一行输出比赛持续的时间tt。(t为整数)
如果兔子输掉比赛(即两者永远碰不到)就输出 “lueluelue” 对其嘲讽。
样例输入
2 3 4 5 6
样例输出
win!
5
题解:A,B,a,b,L分别为兔子和乌龟的起始点、速度、场地长度,x为时间,y为相差的圈数,由公式再进行拓展欧几里得运算,得到x,y(b-a为负数的时候要互换b、a和A、B的值,暂时没搞明白为啥)
#include<iostream>
#include<cmath>
#include<cstdio>
#define ll long long
using namespace std;
void exgcd(ll a,ll b,ll &gcd,ll &x,ll &y){
if(!b){
gcd=a;x=1;y=0;
}else{
exgcd(b,a%b,gcd,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
}
}
int main(){
int T;
ll a,b,A,B,x,y,gcd,ans,t,l,p,k,cha,xx,yy;
scanf("%lld%lld%lld%lld%lld",&A,&B,&a,&b,&l);
cha=A-B;
if(a>b)//b-a必须为正值
swap(a,b),cha*=-1;
exgcd(b-a,l,gcd,x,y);
//A+a*x-B-b*x=L*y ==> (b-a)*x+L*y=A-B.
if(cha%gcd){
printf("lueluelue\n");
}else{
p=l/gcd;
k=cha/gcd;
x=(x*k%p+p)%p;
printf("win!\n");
printf("%lld\n",x);
}
return 0;
}