某个状态的SG函数被定义为 除该状态能一步转移到的状态的SG值以外的最小非负整数。
有如下性质:从SG值为x的状态出发,可以转移到SG值为0,1,...,x-1的状态。
不论SG值增加与否,我们都可以将当前所有子游戏的SG值异或起来从而判断胜负状态。
常采用记忆化搜索来计算SG函数。
#include<cstdio> #include<set> #include<cstring> using namespace std; int fib[1001],a[3],SG[1001],m; int sg(int x) { if(SG[x]!=-1) return SG[x]; set<int>S; for(int i=1;i<=m;++i) { if(fib[i]>x) break; S.insert(sg(x-fib[i])); } for(int i=0;;++i) if(S.find(i)==S.end()) return SG[x]=i; } int main() { fib[1]=fib[2]=1; for(m=2;fib[m+1]<=1000;++m) fib[m+1]=fib[m]+fib[m-1]; memset(SG,-1,sizeof(SG)); while(1) { scanf("%d%d%d",&a[0],&a[1],&a[2]); if((!a[0])&&(!a[1])&&(!a[2])) break; puts((sg(a[0])^sg(a[1])^sg(a[2]))?"Fibo":"Nacci"); } return 0; }
时间: 2024-10-12 12:17:40