题目链接: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;
}
本文深入探讨了HDU1848斐波那契再三问题的解决策略,通过引入SG函数模板并进行优化,实现了对问题的有效求解。特别关注于亦或运算符的优先级问题,强调了在适当位置使用括号的重要性。此教程详细介绍了算法的具体步骤和实现细节,为读者提供了一个清晰的解题思路。

被折叠的 条评论
为什么被折叠?



