HDOJ 1848(SG函数)
对于SG函数来说,sg[y]=x的意义为,x与y的输赢状态是相同的
sg[y]=mex(y)的定义与n.p点的定义是相同的
#include<iostream>
#include<cstring>
using namespace std;
int SG[1001],f[20]={1,2};
int flag[20];
void getfibo()
{
int i;
for(i=2;i<=15;i++) f[i]=f[i-1]+f[i-2];
}
void getSG(int x)
{
int i,j;
memset(SG,0,sizeof(SG));
for(i=0;i<x;i++)//对i点的SG值进行搜索
{
memset(flag,0,sizeof(flag));
for(j=0;f[j]<=i;j++)//对i点所有后继点的SG值进行标记
{
flag[SG[i-f[j]]]=1;
}//
for(j=0;;j++)//搜索没有被标记的最小值
{
if(flag[j]==0)
{
SG[i]=j;
break;
}
}
}
}
int main()
{
int m,n,p;
int t1,t2,t3;
int ans;
int i;
getfibo();
getSG(1000);
for(i=0;i<30;i++) cout<<SG[i]<<" ";
while(cin>>m>>n>>p)
{
if(m==0&&n==0&&p==0) break;
ans=SG[m]^SG[n]^SG[p];
if(ans==0) cout<<"Nacci"<<endl;
else cout<<"Fibo"<<endl;
}
return 0;
}