HDU 1848 Fibonacci again and again(简单博弈SG函数)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1848 Fibonacci again and again(简单博弈SG函数)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848

题目:

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就可以了,但是太久没写题,连SG都不会写了,于是想起当初看的大佬的博客 https://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html 
代码:
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e3 + 10;
int SG[maxn];
int fib[maxn];
bool suf[maxn];

void init()
{
	fib[0]=1;
	fib[1]=2;
	for(int i=2;i<100;i++)  fib[i]=fib[i-1]+fib[i-2];
}

void sg()
{
    int i,j;  
    for(i=1;i<maxn;i++)
	{
        memset(suf,0,sizeof(suf));
        for(j=0;fib[j]<=i&&j<maxn;j++)  suf[SG[i-fib[j]]]=1;
        for(j=0;;j++)
		{
			if(!suf[j])
			{
				SG[i]=j;
				break;
			}
		}
    }
}

int main()
{
	init();
	sg();
	int m,n,p;
	while(~scanf("%d%d%d",&m,&n,&p)&&(m||n||p))
	{
		if(SG[m]^SG[n]^SG[p])  puts("Fibo");
		else puts("Nacci");
	}
	return 0;
}

  

以上是关于HDU 1848 Fibonacci again and again(简单博弈SG函数)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1848 Fibonacci again and again

HDU1848 Fibonacci again and again(SG函数)

hdu 1848 Fibonacci again and again(SG函数)

HDU 1848(sg博弈) Fibonacci again and again

HDU1848Fibonacci again and again(博弈论)

题解报告:hdu 1848 Fibonacci again and again(尼姆博弈)