标签:mod -o 等于 %x question 设置 its \n clu
一行三个正整数A,B和L,分别表示msc初始的数字,mas初始的数字和阈值。
一行两个字符串‘Yes‘或‘No‘,分别表示msc先手以及后手时能否胜利,如果可以则输出‘Yes‘,否则输出‘No‘(不包含单引号)。
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 }
标签:mod -o 等于 %x question 设置 its \n clu
原文地址:https://www.cnblogs.com/acgoto/p/9937864.html