题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848
思路:一共三堆石子,每堆石子可以分别看成一个子游戏,和游戏的SG函数值即为分游戏SG函数值得Nim和。
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std;
const int maxn = 1000 + 10;
int sg[maxn], vis[maxn], f[maxn];
void init() {
f[1] = 1, f[2] = 2;
for(int i = 3; ; i++) {
f[i] = f[i-1] + f[i-2];
if(f[i] > maxn) break;
}
}
void val() {
for(int i = 1; i <= maxn; i++) {
memset(vis, 0, sizeof vis);
for(int j = 1; f[j] <= i; j++) vis[sg[i-f[j]]] = 1;
for(int j = 0; ; j++) if(!vis[j]) {
sg[i] = j;
break;
}
}
}
int main() {
init();
val();
int n, m, p;
while(scanf("%d%d%d", &n, &m, &p) && n) {
int sum = sg[n] ^ sg[m] ^ sg[p];
if(sum) printf("Fibo\n");
else printf("Nacci\n");
}
}