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

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

首先,证明要依赖一个邓肯多夫定理(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分别代表什么的下标,+_+

于是还是感慨一下:看论文找证明还是“帆 樯”看英文资料,里面的证明十分简洁严谨。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 typedef long long LL;
 5
 6 const LL maxn = (1LL << 31);
 7 LL a[50];
 8
 9 int main()
10 {
11     a[0] = 1, a[1] = 2;
12     for(int i = 2; a[i-1] <= maxn; i++)
13         a[i] = a[i-1] + a[i-2];
14     LL n;
15     while(scanf("%lld", &n) == 1 && n)
16     {
17         int i = lower_bound(a, a + 45, n) - a;
18         printf("%s\n", a[i] == n ? "Second win" : "First win");
19     }
20
21     return 0;
22 }

代码君

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4418186.html

HDU 2516 (Fabonacci Nim) 取石子游戏相关推荐

  1. 取石子游戏详解NIM

    取石子游戏详解NIM 分类: 编程之美2014-09-13 09:38 478人阅读 评论(3) 收藏 举报 编程之美 目录(?)[+] http://blog.csdn.net/pipisorry/ ...

  2. 博弈论之取石子游戏的学习

    以下内容来自转载: 博弈问题简介 所讨论的博弈问题满足以下条件: 玩家只有两个人,轮流做出决策 游戏的状态集有限,保证游戏在有限步后结束,这样必然会产生不能操作者,其输 对任何一种局面,胜负只决定于局 ...

  3. hdu 2516 取石子游戏

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

  4. HDU2516 取石子游戏【博弈】

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

  5. bzoj 1413: [ZJOI2009]取石子游戏(博弈+DP)

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 711  Solved: 470 [Submit][Sta ...

  6. BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp

    title BZOJ 1413 Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行, ...

  7. 取石子游戏(hdu1527+威佐夫博弈)

    S - 取石子游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Submit ...

  8. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  9. bzoj1874: [BeiJing2009 WinterCamp]取石子游戏

    1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 834  Solved: 350 ...

最新文章

  1. 实战:基于 CNN 的验证码破解项目(附代码)
  2. Maven多模块项目中应用maven-tomcat-plugin热部署
  3. Java中的访问控制权限
  4. 计算机等级考试初级网络工程师,计算机等级网络工程师考试内容
  5. 程序员谈敏捷开发团队里成员间的相互信任
  6. sublime 正则搜索日语字符
  7. [TP5填坑]关于助手函数input一不小心取不到get值的解决办法
  8. 3个可以写进简历的京东AI NLP项目实战
  9. Windows下Netcat安装
  10. python关闭函数解释器_深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!...
  11. 洛谷 2051 [AHOI2009] 中国象棋
  12. 测测你的杀毒软件强弱等级吧!!!!!
  13. 快播(QvodPlayer)最新版 v5.20.234 官方版
  14. word排版快捷指令_Word怎么快速排版?这12招Word排版小技巧,3分钟完成一个Word文档...
  15. 腾讯2021校园招聘全球启动
  16. 6,Java毕向东百度云盘
  17. 数据导入与预处理-第6章-04pandas综合案例
  18. Flink Event Time , Processing Time 和 Ingestion Time概念
  19. Linux管道通信多次读写,linux进程通信之(二):管道的读与写
  20. 关于react-router-dom 6.0.1的基础写法 解决Error A <Route> is only ever to be used as the child of <Routes>

热门文章

  1. 程序人生:给所有程序员的27个建议,抽空看看吧!
  2. 【高并发】面试官:性能优化有哪些衡量指标?需要注意什么?
  3. 推荐VSCode12个比较实用的插件
  4. MYSQL关于日期统计常用的SQL语句
  5. mysql设置环境变量
  6. myeclipse深色模式_完善深色模式的调色板
  7. 比特平面分层_平面设计中的分层
  8. 纯靠技术,很难进入大厂了。。。
  9. 鸡蛋学运维-2:Rsync同步配置步骤
  10. 博世豪掷10亿欧元德国建半导体工厂,要掌握自动驾驶芯片化核心竞争力?