hdu-------(1848)Fibonacci again and again(sg函数版的尼姆博弈)

Fibonacci again and again

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5088    Accepted Submission(s): 2126

Problem Description

任何一个大学生对菲波那契数列(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就是曾经的浙江省赛题。
今天,又一个关于Fibonacci的题目出现了,它是一个小游戏,定义如下:
1、  这是一个二人游戏;
2、  一共有3堆石子,数量分别是m, n, p个;
3、  两人轮流走;
4、  每走一步可以选择任意一堆石子,然后取走f个;
5、  f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量);
6、  最先取光所有石子的人为胜者;

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

Input

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

Output

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

Sample Input

1 1 1
1 4 1
0 0 0

Sample Output

Fibo
Nacci

Author

lcy

Source

ACM Short Term Exam_2007/12/13

Recommend

一下为一些不错的学习资料...

http://lolita-angel.diandian.com/post/2012-10-11/40039176977

http://www.cnblogs.com/AndreMouche/archive/2011/03/27/1997174.html

http://www.cnblogs.com/loveidea/archive/2013/04/17/3027373.html

http://hi.baidu.com/tkdsheep/item/cad712ac817599d35af19177

http://blog.csdn.net/shuimu12345678/article/details/7677043

http://blog.sina.com.cn/s/blog_83d1d5c70100y9yd.html(这篇写的很好)

http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617(这篇对于异或部分讲得极好!!很值得一看)

http://www.cnitblog.com/weiweibbs/articles/42735.html(太高深了,看不懂)

http://blog.sina.com.cn/s/blog_6ec19c780100vibi.html

http://hi.baidu.com/king___haha/item/542a071140107f9598ce337c

http://blog.csdn.net/qiankun1993/article/details/6765688

http://www.cnblogs.com/exponent/articles/2141477.html(这篇讲的也非常好)

准确来说,sg函数就是对于每一个状态 x,它的sg函数是x连接的点 y1,y2,y3,y4,..,yn 他们的sg值sg[y1],sg[y2],sg[y3],sg[y4],..,sg[yn] 这些值中没有出现的最小非负整数 那么对于一个P点,它的出度为0,那么sg函数一定为0, 对于一个N点,它必定能走到一个P点,而P点的sg值为0,所以N点的sg值不为零。

贴上自己理解之后写的代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 int fibo[15]={1,2,3,5,8,13,21,34,55,89,144,233,377,610,987};
 4 int sg[1002];
 5 bool sav[1002];
 6 int main(){
 7  int n,m,p;
 8  //对于(m,n,p)求出E的最小等价类
 9  for(int i=0;i<=1000;i++) {
10      sg[i]=i;
11      memset(sav,0,sizeof(bool)*(i+1));
12      for(int j=0;j<15&&fibo[j]<=i;j++){
13          sav[sg[i-fibo[j]]]=1;   //求每一个i的出等价类
14      for(int j=0;j<=i;j++){
15          if(!sav[j]){
16             sg[i]=j;
17             break;
18         }
19      }
20     }
21  }
22  while(scanf("%d%d%d",&n,&m,&p),n+m+p) {
23      //得到态势之后,就是一个尼姆博弈了
24      if(sg[n]^sg[m]^sg[p])
25       puts("Fibo");
26      else
27        puts("Nacci");
28
29  }
30   return 0;
31 }

时间: 2024-12-18 07:55:33

hdu-------(1848)Fibonacci again and again(sg函数版的尼姆博弈)的相关文章

题解报告:hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1850 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧陪妈妈逛一次菜场悄悄给爸爸买个小礼物主动地 强烈地 要求洗一次碗某一天早起 给爸妈用心地做回早餐如果愿意 你还可以和爸妈说咱们玩个小游戏吧 ACM课上学的呢-下面是一个二人小游戏:桌子上有M堆扑克牌:每堆牌的数量分别为Ni(i=1-M):两人轮流进行:每走一步可以任意选择一堆并取

HDU - 1848 - Fibonacci again and again

先上题目: Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4964    Accepted Submission(s): 2072 Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F

HDU 3032 Nim or not Nim?(sg函数)

题目链接 暴力出来,竟然眼花了以为sg(i) = i啊....看表要认真啊!!! #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define LL __int64 int dp[10001]; int sg(int x) { int flag[10001],temp,i; if(dp[x] >= 0) return dp[x]; memset(flag,

[hdu-5795]A Simple Nim 博弈 尼姆博弈 SG函数打表找规律

[题目]题目链接 Two players take turns picking candies from n heaps,the player who picks the last one will win the game.On each turn they can pick any number of candies which come from the same heap(picking no candy is not allowed).To make the game more int

hdu 1850 Being a Good Boy in Spring Festival (尼姆博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4658    Accepted Submission(s): 2781 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买

hdu 1849(Rabbit and Grass) 尼姆博弈

Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3864    Accepted Submission(s): 2919 Problem Description 大学时光是浪漫的,女生是浪漫的,圣诞更是浪漫的,但是Rabbit和Grass这两个大学女生在今年的圣诞节却表现得一点都不浪漫:不去逛商场,不去逛

POJ 3480 &amp; HDU 1907 John(尼姆博弈变形)

题目链接: PKU:http://poj.org/problem?id=3480 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1907 Description Little John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to e

hdu 1849 (尼姆博弈)

http://acm.hdu.edu.cn/showproblem.php?pid=1849 简单的尼姆博弈: 代码如下: #include <iostream> #include <cstdio> using namespace std; int main() { int m,n,t; while(cin>>m,m) { int ans=0; for(int i=0; i<m; i++) { cin>>n; ans^=n; } if(ans==0)

HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)

Fibonacci again and again Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(n-2)(n>=3); 所以,1,2,3,5,8,13……就是菲波那契数列. 在