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先手或后手时能否胜利。
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 }