Fibonacci again and again

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

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
 
由于本题n的范围为1000,所以时间复杂度不是很高
下面两种方法的代码都可以过,,
15086248 2015-10-12 19:11:07 Accepted 1848 0MS 1576K 1320 B G++ 牟柏旭
 
   //f[]:可以取走的石子个数
//sg[]:0~n的SG函数值
//Hash[]:mex{}
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
const int K=;
int f[K],sg[N],Hash[N];
int k;
void getSG(int n)
{
memset(sg,,sizeof(sg));
for(int i=; i<=n; i++) {
memset(Hash,,sizeof(Hash));
for(int j=; f[j]<=i && j < k; j++) //k是f[]的有效长度
Hash[sg[i-f[j]]]=;
for(int j=; ; j++) { //求mes{}中未出现的最小的非负整数
if(Hash[j]==) {
sg[i]=j;
break;
}
}
}
}
int main(){
int x1,x2,x3;
f[]=;
f[]=;
for(int i=;i<=;i++)
f[i]=f[i-]+f[i-];
k=;
getSG();
while(scanf("%d%d%d",&x1,&x2,&x3)!=EOF){
if(x1==&&x2==&&x3==)
break;
int ans;
ans=sg[x1]^sg[x2]^sg[x3];
if(ans)
printf("Fibo\n");
else
printf("Nacci\n"); }
return ;
}

上面的打表的代码,下面附上dfs代码

15087133 2015-10-12 20:11:06 Accepted 1848 109MS 1880K 1060 B C++ 牟柏旭
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm> using namespace std;
const int k=;
int s[],sg[];
int getsg(int m)
{
int hash[]={};
int i;
for(i=;i<k;i++){
if(m-s[i]<)
break;
if(sg[m-s[i]]==-)
sg[m-s[i]]=getsg(m-s[i]);
hash[sg[m-s[i]]]=;
}
for(i=;;i++)
if(hash[i]==)
return i; }
int main()
{
int x[];
s[]=;
s[]=;
for(int i=;i<;i++)
s[i]=s[i-]+s[i-];
while(scanf("%d%d%d",&x[],&x[],&x[])!=EOF)
{
if(x[]==&&x[]==&&x[]==)
break;
int i; memset(sg,-,sizeof(sg));
sg[]=; int ans=; for(int i=;i<=;i++){
if(sg[x[i]]==-)
sg[x[i]]=getsg(x[i]);
ans^=sg[x[i]];
}
if(ans)
cout<<"Fibo"<<endl;
else cout<<"Nacci"<<endl; }
return ;
}
15087680 2015-10-12 20:35:01 Accepted 1848 140MS 1772K 1384B C++ 牟柏旭
    #include<cstdio>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
int knum;
int si[N],sg[];
int mex(int x)//求x的sg值(可作为模版应用)
{
if(sg[x]!=-)
return sg[x];
bool vis[N];
memset(vis,false,sizeof(vis));
for(int i=;i<knum;i++) {
int temp=x-si[i];
if(temp<)
break;
sg[temp]=mex(temp);
vis[sg[temp]]=true;
}
for(int i=;i<;i++) {
if(!vis[i]) {
sg[x]=i;
break;
}
}
return sg[x];
}
int main() { int x[]; while(scanf("%d%d%d",&x[],&x[],&x[])!=EOF) {
if(x[]==&&x[]==&&x[]==)
break;
si[]=;
si[]=;
for(int i=;i<;i++)
si[i]=si[i-]+si[i-];
knum=;
memset(sg,-,sizeof(sg));
sg[]=; int ans=; for(int j=;j<=;j++) { ans^=mex(x[j]);//尼姆博弈
}
if(ans==)
printf("Nacci\n");
else
printf("Fibo\n"); }
return ;
}
 

hdu 1848 sg——dfs&&打表双实现的更多相关文章

  1. hdu 2147 SG函数打表(手写也可以) 找规律

    kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/1000 K (Java/Others) Total ...

  2. HDU 1848 SG函数博弈

    Fibonacci again and again Problem Description   任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1 ...

  3. hdu 1848(SG函数)

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  4. hdu 1536 sg (dfs实现)

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. SG函数入门&&HDU 1848

    SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...

  6. hdu 1848 Fibonacci again and again(SG函数)

    Fibonacci again and again HDU - 1848 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)= ...

  7. HDU 2586 How far away(dfs+邻接表)

    How far away [题目链接]How far away [题目类型]dfs+邻接表 &题意: 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起来,接下了有m次询问,每次询问 ...

  8. HDU 2563 统计问题 (DFS + 打表)

    统计问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. hdu1848(sg函数打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: #include <iostrea ...

随机推荐

  1. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

  2. 杂谈 什么是伪共享(false sharing)?

    问题 (1)什么是 CPU 缓存行? (2)什么是内存屏障? (3)什么是伪共享? (4)如何避免伪共享? CPU缓存架构 CPU 是计算机的心脏,所有运算和程序最终都要由它来执行. 主内存(RAM) ...

  3. Sublime的用法

    一.首先安装插件 1.安装Package Control,这是为了安装其他插件做基础,它可以方便我们下载其他插件 (1).按Ctrl+`调出console(注:避免热键冲突) (2).粘贴以下代码到命 ...

  4. mui开发中获取单选按钮、复选框的值

    js获取单选按钮的值 function getVals(){ var res = getRadioRes('rds'); if(res == null){mui.toast('请选择'); retur ...

  5. FusionCharts3.2.1 参数的详细说明和功能特性

    功能特性animation                    是否动画显示数据,默认为1(True)showNames                 是否显示横向坐标轴(x轴)标签名称rotat ...

  6. 忘记Centos7.2下root用户密码后的处理方式

    1)重启系统 重新启动系统后并按f2键,进入如下的界面,再按e键. 2)修改启动内核代码 在代码的linux16行中,将ro rhgb的ro修改为rw init=/sysroot/bin/sh. 3) ...

  7. Spring 配置定时器(注解+xml)方式—整理

    一.注解方式 1. 在Spring的配置文件ApplicationContext.xml,首先添加命名空间 xmlns:task="http://www.springframework.or ...

  8. 洛谷 P1311 选择客栈

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  9. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource

    spring boot web项目运行时提示如下错误 org.springframework.beans.factory.BeanCreationException: Error creating b ...

  10. 系统报错undefine not symbol armv7

    libz.dylib libsqlite3.dylib libstdc++.dylib 添加这些动态链接库