题目
变种的尼姆博弈,可以通过SG函数转化为尼姆博弈进行解决
题解
先求出斐波那契数列,然后求出相应的SG函数,又因为是三个堆,所以根据解决尼姆博弈的方法将SG函数值进行异或,得到答案
代码
#include<iostream>
#include<cstring>
using namespace std;
const int Maxm=1010,Maxn=10;
int f[20],sg[Maxm];
bool Hash[Maxm];
void Getsg()
{
f[0]=1;f[1]=1;
for(int i=2;i<=16;i++){
f[i]=f[i-1]+f[i-2];
}
for(int i=1;i<Maxm;i++){
//cout<<"i:"<<i<<endl;
memset(Hash,false,sizeof(Hash));
for(int j=1;j<=16&&f[j]<=i;j++){
Hash[sg[i-f[j]]]=true;
//cout<<sg[i-f[j]]<<' ';
}
//cout<<endl;
for(int j=0;j<=i;j++){
if(!Hash[j]){
sg[i]=j;
//cout<<j<<endl;
break;
}
}
}
}
int main()
{
Getsg();
int m1,m2,m3;
while(scanf("%d%d%d",&m1,&m2,&m3)==3&&m1){
if((sg[m1]^sg[m2]^sg[m3])!=0){
cout<<"Fibo"<<endl;
}
else{
cout<<"Nacci"<<endl;
}
}
}