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

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

首先,证明要依赖一个邓肯多夫定理(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 ;
}

代码君

随机推荐

  1. DBoW2库介绍

    DBoW2库是University of Zaragoza里的Lopez等人开发的开源软件库. 由于在SLAM回环检测上的优异表现(特别是ORB-SLAM2),DBoW2库受到了广大SLAM爱好者的关 ...

  2. 图解TCP、IP笔记

    七层:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 应用层:与通信无关的功能 表示层:例如转换编码格式 会话层:采用哪种连接方法 传输层以下: 传输层:确立连接与断开连接重发 网络层:从 ...

  3. RequestDemo01

    package com.etc.requestdemo; import java.io.IOException;import java.io.PrintWriter; import javax.ser ...

  4. (引用)web安全测试

    转载:http://www.51testing.com/html/44/15020244-908645.html Web安全测试之XSS XSS 全称(Cross Site Scripting) 跨站 ...

  5. js计算两个日期相隔几小时几分钟?

        var dt1 = "2009-11-5 10:30"       var dt2 = "2009-11-8 9:20"     function ge ...

  6. XML的SelectNodes使用方法以及XPath

    XPath 是 XML 的内容,这里 SelectNodes 是 C# 中 XmlDocument 或 XmlNode 的一个方法.SelectNodes 使用 XPath 来选取节点. 重要语法 S ...

  7. Cows(poj 2481 树状数组)

    Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15301   Accepted: 5095 Description ...

  8. 201521123105《jave程序》第二周学习总结

    1. 本周学习总结 学习了各种java数据类型以及各种运算符的使用 学习了一维,二维数组的用法 学习了String类对象使用 2. 书面作业 使用Eclipse关联jdk源代码,并查看String对象 ...

  9. zoj 1526 Big Number 数学

    Big Number Time Limit: 10 Seconds      Memory Limit: 32768 KB In many applications very large intege ...

  10. 用Node.JS+MongoDB搭建个人博客(万众期待的router.js)(四)

    万众期待的router.js,是我现在最想写的一个博客.因为他包含了整个个人博客的精髓.在这里,所有的请求配置,返回的参数等等所做的业务逻辑都在这个文件里实现. 我会详细说明这些代码的作用,所以这篇博 ...