思路:先算出1000以为内的Fibonacci数,其实也就是前15个。然后求SG值,异或起来就是答案。
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 1e3 + 5;
//f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理
//SG[]:0~n的SG函数值
//S[]:为x后继状态的集合
int F[MAXN], SG[MAXN], S[MAXN];
void FiboNacci(int f0, int f1, int n)
{
F[0] = f0; F[1] = f1;
for (int i = 2; i <= n; i++) F[i] = F[i-1] + F[i-2];
}
void get_SG(int n, int N)
{
memset(SG, 0, sizeof(SG));//因为SG[0]始终等于0,所以i从1开始
for(int i = 1; i < n; i++)
{
memset(S, 0, sizeof(S));//每一次都要将上一状态 的 后继集合 重置
for(int j = 0; F[j] <= i && j < N; j++)
S[SG[i-F[j]]] = 1; //将后继状态的SG函数值进行标记
for(int j = 0; ; j++) //查询当前后继状态SG值中最小的非零值
if(!S[j]) { SG[i] = j; break; }
}
}
int main()
{
FiboNacci(1, 1, 16);
get_SG(MAXN, 16);
int m, n, p;
while (cin >> m >> n >> p && (m + n + p))
{
if (SG[m]^SG[n]^SG[p]) printf("Fibo\n");
else printf("Nacci\n");
}
return 0;
}
/*
1 1 1
1 4 1
0 0 0
*/
/*
Fibo
Nacci
*/