HDU 2516 (Fabonacci Nim) 取石子游戏
这道题的结论就是,石子的个数为斐波那契数列某一项的时候,先手必败;否则,先手必胜。
结论很简单,但是证明却不是特别容易。找了好几篇博客,发现不一样的也就两篇,但是这两篇给的证明感觉证得不清不楚的,没看太懂。
首先,证明要依赖一个邓肯多夫定理(Zeckendorf's Theorem):任何一个正整数一定能分解成若干个不重复且不相邻的斐波那契数之和。
首推维基百科上的英文证明,很严谨也能看懂,证明的过程中还用到了一条引理,但是很容易用数学归纳法证明,所以整个过程都是十分严谨的:http://en.wikipedia.org/wiki/Zeckendorf%27s_theorem
然后对于一个必胜状态,则这个数可以分解成多个斐波那契数之和,或者可以对应地将这堆石子分成若干堆来看,而且每堆石子的数量都是一个斐波那契数。
先手取完最小的那个石子堆,其数量为Fi,由于邓肯多夫定理定理,第二小的石子堆Fj ≥ Fi+2 = Fi + Fi+1 > 2Fi,所以后手面对的局面就是若干个斐波那契数,而且不能一次取完最小的石子堆。然后等后手取完以后再继续将剩下的石子数分解,再取最小的斐波那契数即可。
对于一个先手必败状态,也就是一个斐波那契数局面,证明不太会证。
这有一篇证明,但是感觉不严谨啊:http://blog.csdn.net/acm_cxlove/article/details/7835016
里面说
如果先手第一次取的石子数y>=f[k-1]/3,则这小堆所剩的石子数小于2y,即后手可以直接取完
这是对的,但是他为什么没有讨论y < f[k-1]/3的情况嘞?
然后又找到一篇证明,http://yjq24.blogbus.com/logs/46150651.html
前面还好,但是最后那个不等式我又是看得不明不白的。不知道i,j分别代表什么的下标,+_+
于是还是感慨一下:看论文找证明还是“帆 樯”看英文资料,里面的证明十分简洁严谨。
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL; const LL maxn = (1LL << );
LL a[]; int main()
{
a[] = , a[] = ;
for(int i = ; a[i-] <= maxn; i++)
a[i] = a[i-] + a[i-];
LL n;
while(scanf("%lld", &n) == && n)
{
int i = lower_bound(a, a + , n) - a;
printf("%s\n", a[i] == n ? "Second win" : "First win");
} return ;
}
代码君
HDU 2516 (Fabonacci Nim) 取石子游戏的更多相关文章
- 51nod1069【Nim取石子游戏】
具体看:萌新笔记之Nim取石子游戏可以这么写: #include <bits/stdc++.h> using namespace std; typedef long long LL; in ...
- 萌新笔记之Nim取石子游戏
以下笔记摘自计算机丛书组合数学,机械工业出版社. Nim取石子游戏 Nim(来自德语Nimm!,意为拿取)取石子游戏. 前言: 哇咔咔,让我们来追寻娱乐数学的组合数学起源! 游戏内容: 有两个玩家面对 ...
- poj2368 Buttons Nim取石子游戏
链接:http://poj.org/problem?id=2368 和前面差距还是很大啊囧 代码: k,a;main(i){,i=;i<=k/&&k%i;++i);k%i||(a ...
- HDU 1527 (Wythoff 博弈) 取石子游戏
对于Wythoff博弈中的两个数列,An和Bn有这样的关系: An + n = Bn, An = floor(φ * n) 所以我们可以根据a b的差值来计算一个新的a出来看看这两个值是否相等. 想等 ...
- HDU.2516 取石子游戏 (博弈论 斐波那契博弈)
HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...
- HDU 2516 取石子游戏(斐波那契博弈)
取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- HDU 2516 取石子游戏(FIB博弈)
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 2516 取石子游戏 (博弈论)
取石子游戏 Problem Description 1堆石子有n个,两人轮流取.先取者第1次能够取随意多个,但不能所有取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出" ...
- HDU 2516 取石子游戏(斐波那契)
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- ios滤镜
现在很多滤镜效果都写好了,搬运工的我直接拿来用(感谢
- JDBC资料集
1.基本的JDBC概念: http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-basic-jdbc 2.JSP&Servlet学 ...
- ExtJs之DHTML,DOM,EXTJS的事件绑定区别
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据
数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...
- java控制反转与依赖注入
1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...
- 【hdu3065-病毒侵袭持续中】AC自动机
题意:给定一些只含大写字母的病毒串,再给一个文本串,问文本串中每个病毒串各出现了多少次. 题解: 就是用AC自动机,在每个节点末尾有个id记录是哪个单词的末尾,然后如果同时是多个单词的末尾就用一个ne ...
- 如何查看eclipse中servlet跟jsp的版本
打开tomcat的lib 目录下,有两个JAR文件: jsp-api.jar servlet-api.jar .如果没有,那可能是你没有添加进来.解压这两个文件,用记事本分别打开META-INF下的M ...
- [iOS]提交App报错ERROR ITMS -90207
前几天上传项目N多次,都跳出这个问题 甚是头痛,于是乎各种搜索 1. 第三方的info.plist里面Executable file这个要删除(自己的不能删哦) 2.检查一下用来做跳转到第三方应用的设 ...
- http://blog.csdn.net/sd0902/article/details/8395677
http://blog.csdn.net/sd0902/article/details/8395677
- Java:Object类
objcet类中涉及的多态的扩展性,由于Object是所有类的根类,所以它可以接收任意类型的数据,包括基本数据类型.因为这一特点,它可以对多态性进行扩展. 1.创建一个Demo类来判断类类型 clas ...