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为相差的圈数,由公式{\color{Red} A+a*x-B-b*x=L*y ==> (b-a)*x+L*y=A-B.}再进行拓展欧几里得运算,得到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;
}

 

posted @ 2019-04-16 20:03  aeipyuan  阅读(154)  评论(0编辑  收藏  举报