【博弈论 SG函数】Fibonacci again and again
题目
思路
裸的SG函数板子题,只会写板子题的懒狗是我了。
然后试着SG函数打表找一下规律,然后发现完全找不出来啊啊啊淦。三个参数三维度打表直接暴毙.jpg。(大雾)
看来打表的话1维和2维的比较合适
AC代码
SG函数直接做
// Problem: Fibonacci again and again
// Contest: HDOJ
// URL: http://acm.hdu.edu.cn/showproblem.php?pid=1848
// Memory Limit: 32 MB
// Time Limit: 1000 ms
// FishingRod
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long LL;
typedef pair<int,int> PII;
//#define MULINPUT
/*DATA & KEY
*/
int T;
const int N=1e4+10;
LL fib[25]={0,1};
LL f[N];
LL sg(LL x)
{
if(x==0)return 0;
if(f[x]!=-1)return f[x];
unordered_set<int>S;
for(int i=1;i<=18;i++)
{
LL sum=fib[i];
if(x>=sum)S.insert(sg(x-sum));
}
for(int i=0;;++i)
if(!S.count(i))
return f[x]=i;
}
void solve(int C)
{
//NEW DATA CLEAN
//NOTE!!!
for(int i=2;i<=18;i++)fib[i]=fib[i-1]+fib[i-2];
LL res=0;
LL a,b,c;
memset(f,-1,sizeof f);
while(cin>>a>>b>>c)
{
if(a==0&&b==0&&c==0)break;
res=sg(a)^sg(b)^sg(c);
if(res)puts("Fibo");
else puts("Nacci");
}
}
int main()
{
#ifdef MULINPUT
scanf("%d",&T);
for(int i=1;i<=T;i++)solve(i);
#else
solve(1);
#endif
return 0;
}