F: Fabulous Race Between Tortoise And Rabbit 扩展欧几里得

http://oj.jxust.edu.cn/contest/Problem?id=1561&pid=5

题目描述

        经历了上次的惨败,兔子一直心怀不满,又策划了一场比赛,但这次不再是简单的跑步比赛了,他们将在一个神奇的场地进行一次奇妙的比赛:

        这个场地是线性的。它拥有一种神奇的功能,表面看起来它只有L米长,其实是无限的!——当你跑到尽头再往前行进时你会发现,你将从另一端跑出来!

兔子制定的游戏规则很简单:正方向为从右往左,兔子和乌龟同时在不同位置开始朝正方向跑,如果兔子在某一时刻与乌龟相遇(在同一个位置)那么乌龟就输,比赛结束。

乌龟沉思了一会儿,要求增加规则:即兔子和乌龟的速度在整个比赛过程中必须都是不变的。

懒惰又自大的兔子以为这次无论如何都不会输掉比赛,一心只想快点赢,想都没想随口就答应了。

现在对于给定的场地长L,兔子和乌龟的位置x和y,以及兔子和乌龟的速度v1,v2。要你判断兔子是不是会赢呢,如果兔子赢得比赛,就输出“win!”和比赛进行的时间t,如果兔子输掉了比赛,就对它发出嘲讽,输出“lueluelue”

输入

输入包括5个整数x1y1v1v2L

其中x1y1,x12109,y12109

0<v1,v22109,0<L2109

 

输出

如果兔子赢得比赛,就在一行输出“win!”,下一行输出比赛持续的时间t

。(t为整数)

如果兔子输掉比赛(即两者永远碰不到)就输出 “lueluelue” 对其嘲讽。

样例输入

2 3 4 5 6

样例输出

win!
5
#include<iostream>
#include<string.h>
#include<math.h>
#define max 0x3f3f3f3f
#define ll long long
using namespace std;
ll x,y,r,s;
void exgcd(ll a, ll b, ll &x, ll &y)    //拓展欧几里得算法
{
    if(!b) 
        x = 1, y = 0;
    else
    {
        exgcd(b, a % b, y, x);
        y -= x * (a / b);
    }
}

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
void TY(ll a,ll b,ll c)
{
    r=gcd(a,b);
    s=b/r;
    exgcd(a,b,x,y);//得到x0
    x=x*c/r;  //得到x1
    x=(x%s+s)%s;  //得到最小正整数解
}
int main()
{
    ll A,B,a,b,L;
    cin>>A>>B>>a>>b>>L;
    ll aa=b-a,bb=L,cc=A-B;
    if(aa<0)
    {
        aa=-1*aa;
        cc=-1*cc;
        //bb=-1*bb;
    }
    r=gcd(aa,bb);
    if(cc%r!=0)
        printf("lueluelue
");
    else
    {
        printf("win!
");
        TY(aa,bb,cc);
        printf("%lld
",x);
    }
    return 0;

}
原文地址:https://www.cnblogs.com/-citywall123/p/10811824.html