HDU 1848 斐波那契博弈
斐波那契数列数列博弈:给你三堆石子,每次只能取费波契数列个石子,问先手赢输出“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;
}
永远年轻 永远热泪盈眶!

浙公网安备 33010602011771号