题目大意:

给定2个数a , b,假定b>=a总是从b中取走一个a的整数倍,也就是让 b-k*a(k*a<=b)

每人执行一步这个操作,最后得到0的人胜利结束游戏

 

(0,a)是一个终止态P(必胜态)

始终假设b>=a 

那么(a,b)b%a==0 , 那么就是 必败态 N

如果2*a>b>a 那么只能选择进入 (a , b-a)不确定什么状态

因为每个人都很聪明,所以对于碰到一个a ,b的局面

如果 b>a*2 , 那么应该知道 (a , b%a) 是不是一个必胜态,如果不是,那么这个聪明人就总会进入(a , b%a+a) ,就能逼迫对方进入 (a , b%a) 这个必败态

如果 (a , b%a) 是一个必胜态,那么聪明人就会自己进入这个状态

所以 b>2*a的时候,下个人肯定是必胜的,也就是下个人必然进入必胜态,所以这是一个必败态

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 bool dfs(int a , int b)
 7 {
 8     if(a>b) swap(a , b);
 9     if(a == 0) return true;
10     if(b%a == 0 || b > 2*a) return false;
11 
12     bool flag1 = dfs(a , b%a);
13     bool flag2 = false;
14     if(b > 2*a) flag2 = dfs(a , b%a+a);
15     if(flag1 || flag2) return false;
16     return true;
17 }
18 
19 int main()
20 {
21    // freopen("a.in" , "r" , stdin);
22     int a,b;
23     while(scanf("%d%d" , &a , &b) , a||b)
24     {
25         if(dfs(a , b)) puts("Ollie wins");
26         else puts("Stan wins");
27     }
28     return 0;
29 }

 

 posted on 2015-01-26 16:35  Love风吟  阅读(175)  评论(0编辑  收藏  举报