HDU1848 Fibonacci again and again(SG 函数)

任何一个大学生对菲波那契数列(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题解:假的斐波那契博弈;用SG函数推导,只要前20个斐波那契数即可;

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e4+10;
 4 int m,n,p;
 5 int fibo[30];
 6 int SG[maxn],vis[maxn];
 7 void GetSG(int x)
 8 {
 9     memset(SG,0,sizeof SG);
10     int t=1;
11     for(int i=1;i<=x;++i)
12     {
13         for(int j=0;j<30&&fibo[j]<=i;++j) vis[SG[i-fibo[j]]]=t;
14         for(int j=0;j<=x;++j){if(vis[j]!=t){SG[i]=j;break;}}
15         ++t;
16     }
17 }
18 int main()
19 {
20     fibo[0]=1,fibo[1]=2;
21     for(int i=2;i<30;++i) fibo[i]=fibo[i-1]+fibo[i-2];
22     GetSG(maxn-5);
23     while(~scanf("%d%d%d",&m,&n,&p))
24     {
25         if(!m&&!n&&!p) break;
26         int ans=SG[m]^SG[n]^SG[p];
27         if(ans) puts("Fibo");
28         else puts("Nacci");
29     }
30
31     return 0;
32 }

原文地址:https://www.cnblogs.com/songorz/p/10331535.html

时间: 2024-10-11 21:54:31

HDU1848 Fibonacci again and again(SG 函数)的相关文章

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;

hdu1848 Fibonacci again and again(SG函数博弈)

现在换是看不明白SG函数的求法什么的 暂时先当模板题吧 函数mex1就是求g(x) 然后异或 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int k,fibo[100],f[10001]; int mex1(int p){ int i,t; bool g[101]={0}; for(i=0;i<k;i++){

【博弈论】【SG函数】hdu1848 Fibonacci again and again

某个状态的SG函数被定义为 除该状态能一步转移到的状态的SG值以外的最小非负整数. 有如下性质:从SG值为x的状态出发,可以转移到SG值为0,1,...,x-1的状态. 不论SG值增加与否,我们都可以将当前所有子游戏的SG值异或起来从而判断胜负状态. 常采用记忆化搜索来计算SG函数. #include<cstdio> #include<set> #include<cstring> using namespace std; int fib[1001],a[3],SG[10

hdu1848(sg函数打表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: 1 #include <iostream> 2 #include <string.h> 3 #define MAXN 3010 4 using namespace std; 5 6 int f[MAXN], sg[MAXN]; 7 8 void init(){//得到1000以内的fibonacci数列 9 f[1]=1;

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……就是菲波那契数列. 在

hduoj 1848 Fibonacci again and again【sg函数】【博弈】【菲波那切数列】

Fibonacci again and again 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.  这是

HDU 1848 Fibonacci again and again【SG函数】

对于Nim博弈,任何奇异局势(a,b,c)都有a^b^c=0. 延伸: 任何奇异局势(a1, a2,… an)都满足 a1^a2^…^an=0 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数. 例如mex{0,1,2,4}=3.mex{2,3,5}=0.mex{}=0. 对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下: g(x)=mex{ g(y) | y是x的后继 }. SG函数性

HDU1848 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): 8198    Accepted Submission(s): 3412 Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F(2)=2;

sg函数与博弈论

这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手,假设两个人都是足够聪明的AI,那么谁会赢? 显然p≠0时先手赢,他只要全部取完就行了... 我们先不管这个游戏有多傻逼,我们看一看这个游戏所隐含的模型. 比如我们把当前游戏局面抽象成一个点,把这个点往每下一步可以到达的新状态连一个边,这样就形成了一个有向无环图.(如果有环这个游戏就不会结束了) 现