题目:hdu1848
题意:Nim游戏。每次只能拿斐波那契数列中的数。
解答:dfs求sg函数值
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 1100;
int a[MAXN],sg[MAXN];
int m,n,q;
void init()
{
a[0] = 1;
a[1] = 2;
int p = 0;
int q = 1;
for(int i = 2;i <= 18;i++)
{
a[i] = a[p] + a[q];
p++;
q++;
}
}
int getsg(int v)
{
if(sg[v] != -1)
return sg[v];
int vis[MAXN];
memset(vis,0,sizeof(vis));
for(int i = 0;i < 18;i++)
{
int tmp = v - a[i];
if(tmp < 0)
break;
vis[getsg(tmp)] = 1;
}
for(int i = 0;;i++)
{
if(!vis[i])
{
sg[v] = i;
return i;
}
}
}
int main()
{
init();
while(~scanf("%d%d%d",&m,&n,&q))
{
if(!m && !n && !q)
break;
memset(sg,-1,sizeof(sg));
int ans = 0;
ans^=getsg(m);
ans^=getsg(n);
ans^=getsg(q);
if(ans)
printf("Fibo\n");
else
printf("Nacci\n");
}
return 0;
}