Wannafly挑战赛28

A.msc和mas

题目描述

msc有一天遇见了mas,于是他们开始玩游戏。
msc和mas初始各有一个正整数A和B,并且他们共同设置了一个阈值L。
然后游戏就开始了,对于每一局操作的人,假设他手上拿着的是数字x,对手手上拿着的是数字y(记这一局开始时y的数值为y0),那么:
1、如果x>L,那么他就胜利了,否则进入步骤2
2、他会给对手的数值加上x(即$ y + x \rightarrow y $),如果此时对手手上的数值y大于等于2y0,那么这一轮结束轮到对手操作,否则继续执行步骤2
由于mas爱慕着msc,所以mas想知道当msc先手或后手时能否胜利。

输入描述:

一行三个正整数A,B和L,分别表示msc初始的数字,mas初始的数字和阈值。

输出描述:

一行两个字符串'Yes'或'No',分别表示msc先手以及后手时能否胜利,如果可以则输出'Yes',否则输出'No'(不包含单引号)。
示例1

输入

232 42 9483

输出

No No

备注:

1≤ A,B,L≤ 10^9.
解题思路:简单模拟一下即可。写完非递归后发现每次轮到对手时只是交换两个操作值x,y而已!!!于是就可用简单的尾递归来实现!!!
AC代码一(非递归写法):
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL A,B,C,x,y,k,tmp;bool f2,f4;
 5 int main(){
 6     while(cin>>A>>B>>C){
 7         f2=f4=false;x=A,y=B;
 8         while(1){
 9             if(!f2){///轮到msc,先手
10                 if(x>C)break;
11                 else{
12                     k=y/x,tmp=y;
13                     y+=k*x;
14                     if(y<2LL*tmp)y+=x;
15                 }
16             }
17             else{///轮到mas,后手
18                 if(y>C)break;
19                 else{
20                     k=x/y,tmp=x;
21                     x+=k*y;
22                     if(x<2LL*tmp)x+=y;
23                 }
24             }
25             f2=!f2;
26         }
27         x=A,y=B;
28         while(1){
29             if(!f4){///轮到mas,先手
30                 if(y>C)break;
31                 else{
32                     k=x/y,tmp=x;
33                     x+=k*y;
34                     if(x<2LL*tmp)x+=y;
35                 }
36             }
37             else{///轮到mcs,后手
38                 if(x>C)break;
39                 else{
40                     k=y/x,tmp=y;
41                     y+=k*x;
42                     if(y<2LL*tmp)y+=x;
43                 }
44             }
45             f4=!f4;
46         }
47         printf("%s %s\n",!f2?"Yes":"No",f4?"Yes":"No");
48     }
49     return 0;
50 }

AC代码二(递归写法):

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;LL A,B,C,x;string obj[]={"No","Yes"};
 4 bool check(LL x,LL y,bool flag){
 5     if(x>C)return flag;
 6     return check((y/x+(y%x?1:0))*x+y,x,!flag);
 7 }
 8 int main(){
 9     while(cin>>A>>B>>C){
10         cout<<obj[check(A,B,true)]<<' '<<obj[check(B,A,false)]<<endl;
11     }
12     return 0;
13 }

 

posted @ 2018-11-10 01:11  霜雪千年  阅读(251)  评论(0编辑  收藏  举报