这道题的结论就是,石子的个数为斐波那契数列某一项的时候,先手必败;否则,先手必胜。

结论很简单,但是证明却不是特别容易。找了好几篇博客,发现不一样的也就两篇,但是这两篇给的证明感觉证得不清不楚的,没看太懂。

首先,证明要依赖一个邓肯多夫定理(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) 取石子游戏的更多相关文章

  1. 51nod1069【Nim取石子游戏】

    具体看:萌新笔记之Nim取石子游戏可以这么写: #include <bits/stdc++.h> using namespace std; typedef long long LL; in ...

  2. 萌新笔记之Nim取石子游戏

    以下笔记摘自计算机丛书组合数学,机械工业出版社. Nim取石子游戏 Nim(来自德语Nimm!,意为拿取)取石子游戏. 前言: 哇咔咔,让我们来追寻娱乐数学的组合数学起源! 游戏内容: 有两个玩家面对 ...

  3. poj2368 Buttons Nim取石子游戏

    链接:http://poj.org/problem?id=2368 和前面差距还是很大啊囧 代码: k,a;main(i){,i=;i<=k/&&k%i;++i);k%i||(a ...

  4. HDU 1527 (Wythoff 博弈) 取石子游戏

    对于Wythoff博弈中的两个数列,An和Bn有这样的关系: An + n = Bn, An = floor(φ * n) 所以我们可以根据a b的差值来计算一个新的a出来看看这两个值是否相等. 想等 ...

  5. HDU.2516 取石子游戏 (博弈论 斐波那契博弈)

    HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...

  6. HDU 2516 取石子游戏(斐波那契博弈)

    取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  7. HDU 2516 取石子游戏(FIB博弈)

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. HDU 2516 取石子游戏 (博弈论)

    取石子游戏 Problem Description 1堆石子有n个,两人轮流取.先取者第1次能够取随意多个,但不能所有取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出" ...

  9. HDU 2516 取石子游戏(斐波那契)

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. Static、final、abstract、接口、构造方法及java语法总结

    Static:定义类的时候一般不用static来修饰,在一定意义上,用static修饰的字段可以作为全局变量,static修饰的字段和方法存储在类的内存区域,所有实例共享.static字段和方法都是属 ...

  2. HDU 2671 Can't be easier(数学题,点关于直线对称)

    题目 //数学题//直线 y = k * x + b//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2) /********* ...

  3. iOS视频压缩

    // // ViewController.m // iOS视频测试 // // Created by apple on 15/8/19. // Copyright (c) 2015年 tqh. All ...

  4. ActionResult 返回类型

    类名 抽象类 父类 功能 ContentResult     根据内容的类型和编码,数据内容. EmptyResult     空方法. FileResult abstract   写入文件内容,具体 ...

  5. DevExpress licenses.licx 问题

    在DevExpress ( 当然并不范指DevExpress,很多收费软件都是这样的)中,licenses.licx 是用户许可证书文件,当我们使用某些ActiveX(是Microsoft对于一系列策 ...

  6. Hortworks Hadoop生态圈简介

    Hortworks 作为Apache Hadoop2.0社区的开拓者,构建了一套自己的Hadoop生态圈,包括存储数据的HDFS,资源管理框架YARN,计算模型MAPREDUCE.TEZ等,服务于数据 ...

  7. Unable to open debugger port : java.net.ConnectException “Connection refused”

    http://stackoverflow.com/questions/28283087/unable-to-open-debugger-port-java-net-connectexception-c ...

  8. Project Euler 107:Minimal network 最小网络

    Minimal network The following undirected network consists of seven vertices and twelve edges with a ...

  9. netbeans使用

    下载地址 https://netbeans.org/downloads/ https://netbeans.org/downloads/start.html?platform=linux&la ...

  10. AA投资

    AA投资创建于2015年,总部位于北京,创始人成妙绮和王浩泽,专注于天使轮的技术创新驱动的TMT项目投资. 投资方向 AA投资是一家2015年才成立的风险投资机构,专注于种子轮.天使轮.Pre-A轮的 ...