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 }