https://vjudge.net/problem/HDU-1848
简单的SG函数题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3;
int SG[N+10],Fi[N+10];
set<int> FiBo;
int SS(set<int> S){
int len=S.size();
for(int i=0;i<len;++i){
if(S.find(i)==S.end()){
return i;
}
}
return len;
}
int main(){
int x,y,z;
SG[0]=0;
Fi[1]=1;Fi[2]=1;
FiBo.insert(1);
for(int i=3;Fi[i-1]<=N;++i){
Fi[i]=Fi[i-1]+Fi[i-2];
if(Fi[i]>N)
break;
FiBo.insert(Fi[i]);
}
set<int> S;
for(int i=1;i<=N;++i){
S.clear();
for(int j=0;j<i;++j){
if(FiBo.find(i-j)!=FiBo.end()){
S.insert(SG[j]);
}
}
SG[i]=SS(S);
}
while(cin>>x>>y>>z&&x&&y&&z){
cout<<(((SG[x]^SG[y])^SG[z])?"Fibo":"Nacci")<<endl;
}
}博弈论