描述:

有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:

1)先手不能在第一次把所有的石子取完,至少取1颗;

2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍;

3)取走最后一个石子的人为赢家。

结论:

如果n为斐波那契数(2,3,5,8,13,21,34,55,89...),则先手必败。

证明一:

如果按原来的套路:

由于局面不仅跟当前剩余数有关,还与上次取的数有关,所以状态中需要考虑能取的数(变得没那么直观)。

必败态:当剩余数为斐波那契数,且不能一次取完时;

    当剩余数不是斐波那契数,但其按Zeckendorf定理分解后,不能一次取完其中最小分解数时。

必胜态:当剩余数不是斐波那契数,且其按Zeckendorf定理分解后,能一次取完其中最小分解数时;

    当能一次取完时剩余数时;

只需证明:

1.必败态任一操作都将转为必胜态;

2.必胜态存在一操作转为必败态;

行但是麻烦,仅与当前局面有关的游戏,用这种分析才方便。

证明二:

当开始是斐波那契数时,用数学归纳法证明必败:

当n=2时,必败;

设当n<=f(k)时,必败;

则当n=f(k + 1)时,有f(k + 1) = f(k) + f(k - 1):

  如果取走数量大于等于f(k -1),则后手可以一次取完,由于f(k) < 2(k - 1)。

  则先手不能一次取完f(k - 1)。根据归纳法的假设,对于f(k - 1),后手必能取得f(k - 1)最后一颗。

此时,还需要证明,先手不能一次取完剩下的f(k):

  易得,先手取的石子数x = f(k - 1) / 3时,后手则取2 * f(k - 1) / 3,为最大。

  (由于后手取石子的最大值函数为max(2x, f(k - 1) - x),两者相等时最大,即x = f(k - 1) / 3)

  此时,先手能取得最大值为2 * (2 * f(k - 1) / 3),即4f(k - 1) / 3,与f(k)相比,做差可知后者大,即一次不能取完,由于假设先手必败。

证毕。

当开始不是斐波那契数列时:

由“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。

则数n可以分解为n1 + n2 + ... + nx,(1...x是下标)每个都是斐波那契数,且没有两个是连续的;

此时,只要取走最小的那个即可。由于n(x - 1)和nx不连续,则易得n(x - 1) > 2nx,即取走最小那个数后,后手不能取完第二小的数。

此时,问题分解为多个小的斐波那契数,且必败态都是对方。

最新文章

  1. ARC内存管理机制详解
  2. See you~_树状数组
  3. 细说 webpack 之流程篇
  4. okhttp教程——起步篇
  5. BZOJ1001 狼抓兔子(裸网络流)
  6. MySQL table_id原理及风险分析
  7. javascript弹出框打印某个数值时,弹出NaN?(not a number)
  8. asp.net中的主题
  9. 如何判断CPU的位数
  10. hdu4417 Super Mario 树阵离线/划分树
  11. 轻量级网络库libevent概况
  12. MySQL varchar类型数据转tinyint类型
  13. MySQL学习(二)索引与锁 --- 2019年1月
  14. 「CodeForces - 598B」Queries on a String
  15. Fiddler 会话过滤功能
  16. day42 字段的增删改查详细操作
  17. Laravel上传产品图片Uploading img
  18. 简易DVD查询系统
  19. 要想找出以“y”结尾的名字
  20. 【Unity】角色沿路线移动/朝着目标移动

热门文章

  1. OMAP4之DSP核(Tesla)软件开发学习(三)使能DSP核
  2. Mac安装并破解OmniGraffle7
  3. 为什么有logistics函数
  4. 将 UWP 中 CommandBar 的展开方向改为向下展开
  5. anrdroid AVD启动不起来的问题。Waiting for HOME (&#39;android.process.acore&#39;) to be launched
  6. Tomcat的最大并发数
  7. Django 思维导图
  8. Python自然语言处理(1):初识NLP
  9. eclipse 的安装和汉化
  10. bzoj1811 mea