斐波那契数列数列博弈:给你三堆石子,每次只能取费波契数列个石子,问先手赢输出“Fibo”,否则输出“Nacci”。
主要求出SG函数,然后看 异或值 ,最后根据异或值是否是 0
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int f[20]; int sg[1050], mex[1050]; int main() { int m,n,p; for(int i = 0; i <= 15; i++) //递推求斐波那契数列 if(i == 0 || i ==1) f[i] = 1; else f[i] = f[i-1] + f[i-2]; for(int i = 1; i <= 1000; i++) //从小到大递推每个状态 { memset(mex,0,sizeof(mex)); // 清空 mex for(int j = 1; j <= 15; j++) if(i >= f[j]) //石子数大于等于取的石子数,把后继的 放入 mex中 mex[sg[i-f[j]]] = 1; for(int j = 0; j <= 1000; j++) //求出该状态下 sg值 if(!mex[j]) { sg[i] = j; break; } } while(~scanf("%d%d%d",&m,&n,&p)) { if(!m && !n && !p) return 0; if(!(sg[m]^sg[n]^sg[p])) puts("Nacci"); else puts("Fibo"); } return 0; }