题目链接:HDU 1848 Fibonacci again and again
尼姆博弈。
和上一道题区别在于SG值。
套用SG函数模版。
注意亦或运算符的优先级比较低,低于==,所以要记得在适当的地方加上括号。
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int MAX_N = 1000 + 10;
int f[20],_hash[20];
int sg[MAX_N];
void get_f()
{
f[0] = f[1] = 1;
for(int i = 2;i < MAX_N;i++)
{
f[i] = f[i - 1] + f[i - 2];
if(f[i] >= 1000)
break;
}
}
void getSG(int n)
{
int i,j;
memset(sg,0,sizeof(sg));
for(i=1;i<=n;i++)
{
memset(_hash,0,sizeof(_hash));
for(j=1;f[j]<=i;j++)
_hash[sg[i-f[j]]]=1;
for(j=0;j<=n;j++) //求mes{}中未出现的最小的非负整数
{
if(_hash[j]==0)
{
sg[i]=j;
break;
}
}
}
}
int main()
{
int m,n,p;
while(scanf("%d %d %d",&m,&n,&p),m + n + p)
{
get_f();
getSG(MAX_N);
printf((sg[m] ^ sg[n] ^ sg[p]) == 0 ? "Nacci\n" : "Fibo\n");//亦或运算符优先级低于==,要加上括号
}
return 0;
}