hdu 1848 博弈

比较简单的sg函数的应用,将每一堆的sg值求出,则总游戏的sg值为3个异或起来。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int N = 1001;
 7 const int M = 20;
 8 int sg[N];
 9 int f[M];
10 bool mex[M];
11 
12 void init()
13 {
14     f[0] = 1;
15     f[1] = 2;
16     for ( int i = 2; i < M; i++ )
17     {
18         f[i] = f[i - 1] + f[i - 2];
19     }
20 }
21 
22 void get()
23 {
24     init();
25     for ( int i = 0; i < N; i++ )
26     {
27         memset( mex, 0, sizeof(mex) );
28         for ( int j = 0; i >= f[j]; j++ )
29         {
30             mex[sg[i - f[j]]] = true;
31         }
32         for ( int j = 0; j < M; j++ )
33         {
34             if ( !mex[j] )
35             {
36                 sg[i] = j;
37                 break;
38             }
39         }
40     }
41 }
42 
43 int main ()
44 {
45     get();
46     int a, b, c;
47     while ( scanf("%d%d%d", &a, &b, &c) != EOF )
48     {
49         if ( !a && !b && !c ) break;
50         if ( sg[a] ^ sg[b] ^ sg[c] )
51         {
52             puts("Fibo");
53         }
54         else
55         {
56             puts("Nacci");
57         }
58     }
59     return 0;
60 }

 

posted @ 2015-08-14 16:16  hxy_has_been_used  阅读(162)  评论(0编辑  收藏  举报