胡大牛的sg超短运算~

胡大牛的sg超短运算~
 1  #include < stdio.h >
 2  void  main()
 3  {
 4       int  sg[ 1001 ],num[ 1001 ],fib[ 16 ] = { 1 , 2 },n,m,p,j,i;
 5       for (i = 2 ;i < 16 ;i ++ )
 6          fib[i] = fib[i - 1 ] + fib[i - 2 ]; // 求出斐波那契数列
 7      sg[ 0 ] = 0 ; // 0的sg值为0
 8       for (i = 1 ;i < 1001 ;i ++ )
 9      {
10           for (j = 0 ;fib[j] <= i;j ++ )
11              num[sg[i - fib[j]]] = i; // 把i的后继的sg值都标注一下,表示出现过了,后面找sg的时候用
12           for (j = 0 ;j <= i;j ++ )
13               if (num[j] != i)
14              {sg[i] = j; break ;} // 找到最小的整数j,成为i的sg值
15      }
16       while (scanf( " %d%d%d " , & n, & m, & p) == 3 && (m != 0 || n != 0 || p != 0 ))
17          puts(sg[m] ^ sg[n] ^ sg[p] ? " Fibo " : " Nacci " ); // 异或判断博弈结果,输出结果
18  }

你可能感兴趣的:(胡大牛的sg超短运算~)