SG打表——Fibonacci again and again HDU
阿新 • • 發佈:2018-12-09
題解:SG打表 從1到n列出一堆石子所有可能的情況,在搜尋小於這個i的所有斐波那契數,標記當前 i 減去斐波那契數產生子局面 的SG值,之後得到當前n的SG值
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long int
using namespace std;
int m,n,p;
int f[1005],sg[1005],ha[1005];
void F()
{
f[1] = 1;
f[2] = 1;
for(int i = 3 ; f[i-1 ]<=1000 ; i++)
{
f[i] = f[i-1]+f[i-2];
}
}
void SG(int n)
{
memset(sg,0,sizeof(sg));
for(int i = 1; i <=n ; i++)
{
memset(ha,0,sizeof(ha));
for(int j = 1 ; f[j]<=i ; j++)
ha[sg[i-f[j]]] =1;
for(int j = 0 ; j <= n ; j++)
{
if (ha[j]==0)
{
sg[i] = j;
break;
}
}
}
}
int main()
{
F();
SG(1000);
while(cin>>n>>m>>p&&n+m+p!=0)
{
int sum = 0;
sum^=sg[n]^sg[m]^sg[p];
if(sum != 0) cout<<"Fibo" <<endl;
else cout<<"Nacci"<<endl;
}
return 0;
}