nim博弈变形每次能拿的石子数都是斐波那契数
sg函数模板
//f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理
//SG[]:0~n的SG函数值
//S[]:为x后继状态的集合
int f[N],SG[MAXN],S[MAXN];
void getSG(int n){
int i,j;
memset(SG,0,sizeof(SG));
//因为SG[0]始终等于0,所以i从1开始
for(i = 1; i <= n; i++){
//每一次都要将上一状态 的 后继集合 重置
memset(S,0,sizeof(S));
for(j = 0; f[j] <= i && j <= N; j++)
S[SG[i-f[j]]] = 1; //将后继状态的SG函数值进行标记
for(j = 0;; j++) if(!S[j]){ //查询当前后继状态SG值中最小的非零值
SG[i] = j;
break;
}
}
}
ACcode:
#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
int sg[maxn],f[maxn],a[maxn];
int get_sg(){
f[0]=f[1]=1;
for(int i=2;i<=16;++i)f[i]=f[i-1]+f[i-2];
memset(sg,0,sizeof(sg));
for(int i=1;i<=1000;++i){
memset(a,0,sizeof(a));
for(int j=0;f[j]<=i&&j<=20;++j)
a[sg[i-f[j]]]=1;
for(int j=0;;j++)if(!a[j]){
sg[i]=j;break;
}
}
}
int main(){
int n,loop,cnt=1;
get_sg();
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)&&(a||b||c)){
int x=sg[a]^sg[b]^sg[c];
if(x)puts("Fibo");
else puts("Nacci");
}
return 0;
}