HDU 1848 Fibonacci again and again

~{→看不见LaTex格式的Dalao们请刷新本页Thanks♪(・ω・)ノ←}~

2019寒假集训题

#.Fibonacci again and again

题面

任何一个大学生对菲波那契数列($Fibonacci numbers$)应该都不会陌生,它是这样定义的:
$F(1)=1;$
$F(2)=2;$
$F(n)=F(n-1)+F(n-2)(n>=3);$
所以,$1,2,3,5,8,13$……就是菲波那契数列。
在HDOJ上有不少相关的题目,比如$1005\ Fibonacci\ again\ and\ again$就是曾经的浙江省赛题。
今天,又一个关于$Fibonacci$的题目出现了,它是一个小游戏,定义如下:
1、 这是一个二人游戏;
2、 一共有$3$堆石子,数量分别是$m, n, p$个;
3、 两人轮流走;
4、 每走一步可以选择任意一堆石子,然后取走$f$个;
5、 $f$只能是菲波那契数列中的元素(即每次只能取$\ 1,2,3,5,8$…等数量);
6、 最先取光所有石子的人为胜者;

假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。


Input

输入数据包含多个测试用例,每个测试用例占一行,包含$3​$个整数$m,n,p​$。
$m=n=p=0​$则表示输入结束。


Output

如果先手的人能赢,请输出“$Fibo$”,否则请输出“$Nacci$”,每个实例的输出占一行。


Sample Input

1 1 1

1 4 1

0 0 0


Sample Output

Fibo

Nacci


Hint

$1\leq m,n,p\leq 1,000$

来自$ACM\ Short\ Term\ Exam\ 2007/12/13$

(Html Address:http://acm.hdu.edu.cn/search.php?field=problem&key=ACM+Short+Term+Exam_2007%2F12%2F13&source=1&searchmode=source)


这题啊!

裸的SG函数呀!

没学过的大佬们逛一波博客吧!

(maybe…几万年以后我也会写一篇的吧~)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=0,w=0;
char ch=0;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return w? -x:x;
}
const int MAXN=1010;
int f[MAXN],sg[MAXN];
void Fibonacci()
{
f[1]=1,f[2]=2;
for(int i=3;i<=200;++i)
{
f[i]=f[i-1]+f[i-2];
if(f[i]>1000) break;
}
}
map<int,int> ma;
void Build_Map(int lim)
{
for(int i=1;i<=lim;++i)
{
ma.clear();
for(int j=1;f[j]<=i;++j)
++ma[sg[i-f[j]]];
for(int j=0;j<=lim;++j)
if(!ma[j])
{
sg[i]=j;
break;
}
}
}
int a,b,c;
int main()
{
Fibonacci();
Build_Map(1000);
while(1)
{
a=read(),b=read(),c=read();
if(!a&&!b&&!c) return 0;
int sum=0;
sum^=sg[a]^sg[b]^sg[c];
if(!sum) puts("Nacci");
else puts("Fibo");
}
return 0;
}
-------------本文结束(づ ̄ 3 ̄)づ~感谢您的阅读(*╹▽╹*)-------------