HDU_1848 Fibonacci again and again(SG)
来源:互联网 发布:云计算java工程师招聘 编辑:程序博客网 时间:2024/05/16 14:38
问题描述:
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
思路分析:
这个题挺好的。
sg函数的入门题。
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数g如下:g(x)=mex{ g(y) | y是x的后继 },这里的g(x)即sg[x]
例如:取石子问题,有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个数的SG值为多少?
sg[0]=0,f[]={1,3,4},
x=1时,可以取走1-f{1}个石子,剩余{0}个,mex{sg[0]}={0},故sg[1]=1;
x=2时,可以取走2-f{1}个石子,剩余{1}个,mex{sg[1]}=mex{1},故sg[2]=0;
x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,mex{sg[2],sg[0]}=mex{0,0},故sg[3]=1;
x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,mex{sg[3],sg[1],sg[0]}=mex、{1,1,0},故sg[4]=2;
x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,mex{sg[4],sg[2],sg[1]}=mex{2,0,1},故sg[5]=3;
ac代码:
#include<bits/stdc++.h>using namespace std;int sg[1001];int Fib[101];int hashh[101];void init(){ Fib[1]=1; Fib[2]=2; int top=2; while(Fib[top]<1001) { Fib[++top]=Fib[top-2]+Fib[top-1]; } //cout<<top<<endl;}void get_sg(){ init(); int i,j,k; sg[0]=0; for(i=1;i<1001;i++) { memset(hashh,0,sizeof(hashh)); for(j=1;Fib[j]<=i;j++) { hashh[sg[i-Fib[j]]]=1; } for(k=0;k<1001;k++) { if(hashh[k]) continue; sg[i]=k; break; } }}int main(){ get_sg(); int n,m,q; while(cin>>n>>m>>q && n+m+q) { if(sg[n]^sg[m]^sg[q]) cout<<"Fibo"<<endl; else cout<<"Nacci"<<endl; } return 0;}
- HDU_1848 Fibonacci again and again(SG)
- hdu1848 Fibonacci again and again,SG函数
- HDU1848 Fibonacci again and again SG函数
- [SG函数] HDU1848: Fibonacci again and again
- hdu 1848 Fibonacci again and again(SG)
- HDOJ 1760 Fibonacci again and again 博弈 SG函数
- HDU 1848 - Fibonacci again and again(SG)
- hdu1848 Fibonacci again and again (博弈SG值)
- hdu 1848 Fibonacci again and again sg值 博弈论
- hdu 1848 Fibonacci again and again sg定理
- hdu 1848 Fibonacci again and again SG打表
- Hdu1848 Fibonacci again and again(sg函数)
- HDU 1848 Fibonacci again and again【博弈:SG函数】
- HDU 1848 Fibonacci again and again 博弈论SG函数
- HDoj-1848-Fibonacci again and again-博弈-SG函数
- Fibonacci again and again(sg值的模板应用)
- HDU 1848 Fibonacci again and again(博弈 SG运用)
- hdu1848 Fibonacci again and again(SG函数博弈)
- 区块链搭建矿池
- 【Linux 内核网络协议栈源码剖析】af_inet.c——INET Socket层(2)
- Volley
- Set是如何保证里面的元素唯一
- 洛谷 P1378 油滴扩展
- HDU_1848 Fibonacci again and again(SG)
- Angular(四)内置服务$http
- poj算法题1061——青蛙的约会
- 简单算法之素数筛法
- android中使用自定义字体以及图标字体
- Caffe学习系列(2):数据层及参数
- HDU2149:Public Sale(巴什博弈)
- Leetcode 415. Add Strings (Easy) (cpp)
- 12306泄露数据可视化分析