HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)
Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
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
m=n=p=0则表示输入结束。
Output
Sample Input
1 4 1
0 0 0
Sample Output
Nacci
#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
const int N = ;
const int M = ; int fib[];
int SG[N]; int mex(int x)
{
bool vis[M];
memset(vis,,sizeof(vis));
for(int i=;i<M;i++)
{
int t = x - fib[i];
if(t < ) break;
if(SG[t] == -)
SG[t] = mex(t);
vis[SG[t]] = ;
}
for(int i=;;i++)
if(!vis[i]) return i;
} void Init()
{
fib[] = ;
fib[] = ;
for(int i=;i<M;i++)
fib[i] = fib[i-] + fib[i-];
memset(SG,-,sizeof(SG));
for(int i=;i<N;i++)
SG[i] = mex(i);
} int main()
{
Init();
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
if(a == && b == && c == ) break;
int ans = ;
ans ^= SG[a];
ans ^= SG[b];
ans ^= SG[c];
if(ans) puts("Fibo");
else puts("Nacci");
}
return ;
}
非深搜:
#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
const int N = ;
const int M = ;
int fib[];
int SG[N];
void get()
{
bool vis[M];
for(int i=;i<N;i++) //sg数组
{
memset(vis,,sizeof(vis));
for(int j=;j<M&&fib[j]<=i;j++) //要用的s数组 注意这里有等号
{
vis[SG[i-fib[j]]]=;
}
for(int x=;x<N;x++)
if(!vis[x])
{
SG[i]=x;
break;
}
} }
void Init()
{
fib[] = ;
fib[] = ;
for(int i=;i<M;i++)
fib[i] = fib[i-] + fib[i-];
memset(SG,,sizeof(SG)); //这里定义成 -1和0都可以
get();
} int main()
{
Init();
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
if(a == && b == && c == ) break;
int ans = ;
ans ^= SG[a];
ans ^= SG[b];
ans ^= SG[c];
if(ans) puts("Fibo");
else puts("Nacci");
}
return ;
}
HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)的更多相关文章
- HDU 2516 取石子游戏(斐波那契博弈)
取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- HDU.2516 取石子游戏 (博弈论 斐波那契博弈)
HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...
- hdu 2516 取石子游戏 (斐波那契博弈)
题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜,先取者负输出"Second win",先取者胜 ...
- 题解报告:hdu 2516 取石子游戏(斐波那契博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个, ...
- {HDU}{2516}{取石子游戏}{斐波那契博弈}
题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...
- HDU 2516 取石子游戏 斐波纳契博弈
斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...
- 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)(转)
(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.若(m+1) | n,则先手必败,否则先手必胜.显然,如果n=m+1 ...
- 51Nod 1070 Bash游戏 V4(斐波那契博弈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...
- hdu2516斐波那契博弈
刚开始想用sg函数做,想了半天没一点思路啊. 原来这是一个新题型,斐波那契博弈 斐波那契博弈模型:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:1. 先手不能在第一次把所有的石子取完:2. 之后 ...
随机推荐
- pthread_detach pthread_join pthread_create
pthread_create:创建线程以后线程直接开始运行: pthread_detach pthread_join:线程资源的释放方式. 创建一个线程默认的状态是joinable, 如果一个线程结束 ...
- Eclipse开发Android程序如何在手机上运行
android开发不论是在真机上调试还是最终发布到真机上都非常简单,过程如下: 1.安装usb驱动 手机要能与电脑相连,当然要安驱动了.效果就是你插入手机,电脑显示驱动已识别.驱动安装的官方教程:ht ...
- 分享一段Java搞笑的代码注释
今天在群里看到有人分享了一段搞笑的注释代码,觉得挺好玩的,在这里收藏一下 // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // ...
- Java及Android开发环境搭建
前言 自从接触java以来,配置环境变量折腾了好几次,也几次被搞得晕头转向,后来常常是上网查阅相关资料才解决.但是过一段时间后一些细节就会记不清了,当要在其他机子上配置时又得上网查或者查阅相关书籍,如 ...
- 创建gbk编码
NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_1803 ...
- html5视频播放器
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...
- 新浪微博客户端(13)-使用UIWebView加载OAuth授权界面
使用UIWebView加载OAuth授权界面 DJOAuthViewController.m #import "DJOAuthViewController.h" @interfac ...
- ETHERNET数据包格式( IP & UDP & ICMP & ARP )
ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...
- linux下的struct sigaction
工作中使用案例: struct sigaction act; act.sa_sigaction = handleSignal; act.sa_flags = SA_SIGINFO; sigemptys ...
- RHEL 安装gcc 艰难历程
装好系统后···· 各种搜的方案都不好使····· 最后搜到有人说在刚装系统的时候定制软件之类的那个地方选上“开发工具”就可以...