http://oj.jxust.edu.cn/contest/Problem?id=1561&pid=5
题目描述
经历了上次的惨败,兔子一直心怀不满,又策划了一场比赛,但这次不再是简单的跑步比赛了,他们将在一个神奇的场地进行一次奇妙的比赛:
这个场地是线性的。它拥有一种神奇的功能,表面看起来它只有L米长,其实是无限的!——当你跑到尽头再往前行进时你会发现,你将从另一端跑出来!
兔子制定的游戏规则很简单:正方向为从右往左,兔子和乌龟同时在不同位置开始朝正方向跑,如果兔子在某一时刻与乌龟相遇(在同一个位置)那么乌龟就输,比赛结束。
乌龟沉思了一会儿,要求增加规则:即兔子和乌龟的速度在整个比赛过程中必须都是不变的。
懒惰又自大的兔子以为这次无论如何都不会输掉比赛,一心只想快点赢,想都没想随口就答应了。
现在对于给定的场地长L,兔子和乌龟的位置x和y,以及兔子和乌龟的速度v1,v2。要你判断兔子是不是会赢呢,如果兔子赢得比赛,就输出“win!”和比赛进行的时间t,如果兔子输掉了比赛,就对它发出嘲讽,输出“lueluelue”
输入
输入包括5个整数x1,y
其中x1≠y
0<v1,v2≤2∗109,0<L≤2∗109
输出
如果兔子赢得比赛,就在一行输出“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; }