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 ...
随机推荐
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集
1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
- Java IO(三)
File File类的常见方法: 1.创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文 ...
- MongoDB (三) MongoDB 安装
MongoDB安装在Windows上 在 Windows上,首先要安装 MongoDB下载最新发布的MongoDB: http://www.mongodb.org/downloads 确保得到正确的版 ...
- hdu2021(很闲~~)
http://acm.hdu.edu.cn/showproblem.php?pid=2021 water~~~ #include<iostream> #include<stdio.h ...
- web服务器【apache/nginx] 关闭目录的浏览权限
web服务器[apache/nginx] 关闭目录的浏览权限 我的配置(将Options 中的Indexes干掉): <VirtualHost *:80> ServerAdmin webm ...
- socket异步编程--libevent的使用
使用 libevent 和 libev 提高网络应用性能 http://www.ibm.com/developerworks/cn/aix/library/au-libev/ libevent实现ht ...
- hashmap理解总结
1.hashmap是通过存放对象的hash算法进行对象的存储的,其查询,put,get方法均是. 所以将对象存储进hashmap,set啥时候,要重写hashcode方法. 2.hash算法存储,查询 ...
- haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1 global log 127.0.0.1 local0 log 127.0.0.1 local1 ...
- sqlmap 使用举例
详细的请见: http://drops.wooyun.org/tips/143 http://wenku.baidu.com/link?url=45xj6EVVWQjV8upwrBAMIqPP3xMc ...
- 跨平台 c 开发库 tbox v1.6.0,支持跨平台协程
http://www.oschina.net/news/78582/tbox-v-1-6-0