转自:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617

  1. 取火柴的游戏
  2. 题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 
  3. 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。 
  4. 题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 
  5. 可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
  6. 先解决第一个问题吧。
  7. 定义:若所有火柴数异或为0,则该状态被称为利他态,用字母T表示;否则,
  8. 为利己态,用S表示。
  9. [定理1]:对于任何一个S态,总能从一堆火柴中取出若干个使之成为T态。
  10. 证明:
  11. 若有n堆火柴,每堆火柴有A(i)根火柴数,那么既然现在处于S态,
  12. c = A(1) xor A(2) xor … xor A(n) > 0;
  13. 把c表示成二进制,记它的二进制数的最高位为第p位,则必然存在一个A(t),它二进制的第p位也是1。(否则,若所有的A(i)的第p位都是0,这与c的第p位就也为0矛盾)。
  14. 那么我们把x = A(t) xor c,则得到x < A(t).这是因为既然A(t)的第p位与c的第p位同为1,那么x的第p位变为0,而高于p的位并没有改变。所以x < A(t).而
  15. A(1) xor A(2) xor … xor x xor … xor A(n)
  16. = A(1) xor A(2) xor … xor A(t) xor c xor … xor A(n)
  17. = A(1) xor A(2) xor… xor A(n) xor A(1) xor A(2) xor … xor A(n)
  18. = 0
  19. 这就是说从A(t)堆中取出 A(t) - x 根火柴后状态就会从S态变为T态。证毕
  20. [定理2]:T态,取任何一堆的若干根,都将成为S态。
  21. 证明:用反证法试试。
  22. c = A(1) xor A(2) xor … xor A(i) xor … xor A(n) = 0;
  23. c' = A(1) xor A(2) xor … xor A(i') xor c xor … xor A(n) = 0;
  24. 则有
  25. c xor c' = A(1) xor A(2) xor … xor A(i) xor … xor A(n) xor A(1) xor A(2) xor … xor A(i') xor c xor … xor A(n) = A(i) xor A(i') =0
  26. 进而推出A(i) = A(i'),这与已知矛盾。所以命题得证。
  27. [定理 3]:S态,只要方法正确,必赢。 
  28. 最终胜利即由S态转变为T态,任何一个S态,只要把它变为T态,(由定理1,可以把它变成T态。)对方只能把T态转变为S态(定理2)。这样,所有S态向T态的转变都可以有己方控制,对方只能被动地实现由T态转变为S态。故S态必赢。
  29. [定理4]:T态,只要对方法正确,必败。 
  30. 由定理3易得。
  31. 接着来解决第二个问题。
  32. 定义:若一堆中仅有1根火柴,则被称为孤单堆。若大于1根,则称为充裕堆。
  33. 定义:T态中,若充裕堆的堆数大于等于2,则称为完全利他态,用T2表示;若充裕堆的堆数等于0,则称为部分利他态,用T0表示。
  34. 孤单堆的根数异或只会影响二进制的最后一位,但充裕堆会影响高位(非最后一位)。一个充裕堆,高位必有一位不为0,则所有根数异或不为0。故不会是T态。
  35. [定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。
  36. 证明:
  37. S0态,其实就是每次只能取一根。每次第奇数根都由己取,第偶数根都由对
  38. 方取,所以最后一根必己取。败。同理,  T0态必胜#
  39. [定理6]:S1态,只要方法正确,必胜。 
  40. 证明:
  41. 若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由定理5,对方必输。己必胜。  #
  42. [定理7]:S2态不可转一次变为T0态。 
  43. 证明:
  44. 充裕堆数不可能一次由2变为0。得证。  #
  45. [定理8]:S2态可一次转变为T2态。 
  46. 证明:
  47. 由定理1,S态可转变为T态,态可一次转变为T态,又由定理6,S2态不可转一次变为T0态,所以转变的T态为T2态。  #
  48. [定理9]:T2态,只能转变为S2态或S1态。
  49. 证明:
  50. 由定理2,T态必然变为S态。由于充裕堆数不可能一次由2变为0,所以此时的S态不可能为S0态。命题得证。
  51. [定理10]:S2态,只要方法正确,必胜. 
  52. 证明:
  53. 方法如下:
  54. 1)  S2态,就把它变为T2态。(由定理8)
  55. 2)  对方只能T2转变成S2态或S1态(定理9)
  56. 若转变为S2,  转向1)
  57. 若转变为S1,  这己必胜。(定理5)
  58. [定理11]:T2态必输。 
  59. 证明:同10。
  60. 综上所述,必输态有:  T2,S0
  61. 必胜态:    S2,S1,T0.
  62. 两题比较:
  63. 第一题的全过程其实如下:
  64. S2->T2->S2->T2->  ……  ->T2->S1->T0->S0->T0->……->S0->T0(全0)
  65. 第二题的全过程其实如下:
  66. S2->T2->S2->T2->  ……  ->T2->S1->S0->T0->S0->……->S0->T0(全0)
  67. 下划线表示胜利一方的取法。  是否发现了他们的惊人相似之处。
  68. 我们不难发现(见加黑部分),S1态可以转变为S0态(第二题做法),也可以转变为
  69. T0(第一题做法)。哪一方控制了S1态,他即可以有办法使自己得到最后一根(转变为
  70. T0),也可以使对方得到最后一根(转变为S0)。
  71. 所以,抢夺S1是制胜的关键!
  72. 为此,始终把T2态让给对方,将使对方处于被动状态,他早晚将把状态变为S1.

nim游戏解法(转)的更多相关文章

  1. Nim积解法小结

    由于某毒瘤出题人 redbag 不得不学习一下这个史诗毒瘤算法. 本文参考了 Owaski 的 GameTheory 的课件. 定义 我们对于一些二维 \(\mathrm{Nim}\) 游戏(好像更高 ...

  2. 【博弈论】Nim游戏

    百度百科 Definition 这样的游戏被称为Nim游戏: 1.有两个玩家,轮流进行操作 2.是公平游戏.即面对同一局面两个玩家所能进行的操作是相同的.例如中国象棋不是公平游戏.因为面对同一个局面, ...

  3. NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结

    NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结 经典NIM游戏: 一共有N堆石子,编号1..n,第i堆中有个a[i]个石子. 每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子 ...

  4. 石子游戏(nim游戏+按位考虑)

    题意 给\(n\)堆石子,每次最多可以从一堆中取\(x\)个,问你\(x = 1 ... n\)时的答案. 解法 经典\(nim\)游戏,找规律知\(sg[i] = i \ mod \ (x+1)\) ...

  5. Nim游戏

    目前有3堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:1)每一步应取走至少一枚石子:每一步只能从某一堆中取走部分或全部石子:2)如果谁不能取谁就失败. Bouton定理: 必败状态当 ...

  6. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  7. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

  8. 【BZOJ】3105: [cqoi2013]新Nim游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...

  9. BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

    一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...

随机推荐

  1. 【codeforces 776E】The Holmes Children

    [题目链接]:http://codeforces.com/contest/776/problem/E [题意] f(n)是小于n的不同整数对(x,y)这里x+y==n且gcd(x,y)==1的个数; ...

  2. everyday two problems / 3.11 - 3.17

    7日共14题,因为3.14两题相同,所以实际总共13题 13道题分为难易两部分,没有按照时间顺序排列题目 A.易: 1.覆盖数字的数量 题意: 给出一段从A - B的区间S(A,B为整数) 这段区间内 ...

  3. UCloud 的安全秘钥

    UCloud 的安全秘钥(困难) 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因 ...

  4. poj 1679 判断最小生成树是否唯一

    /* 只需判断等效边和必选边的个数和n-1的关系即可 */ #include<stdio.h> #include<stdlib.h> #define N 110 struct ...

  5. hdu 4081 最小生成树变形

    /*关于最小生成树的等效边,就是讲两个相同的集合连接在一起 先建立一个任意最小生成树,这条边分开的两个子树的节点最大的一个和为A,sum为最小生成树的权值和,B为sum-当前边的权值 不断枚举最小生成 ...

  6. 233 Matrix 矩阵快速幂

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  7. POJ 3304 segments 线段和直线相交

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14178   Accepted: 4521 Descrip ...

  8. HDU 4534

    AC自动机+状态DP. 虽然很明显的AC自动机+状态DP题,但要分析问题上还是欠缺一点了.一直在犹豫枚举每一个字符选或不选的状态会不会超时,以为会达到状态有2^n,但其实根本没有.因为有很多状态是可以 ...

  9. leetcode第一刷_Minimum Window Substring

    好题.字符串.线性时间. 我认为第一次拿到这个题的人应该不会知道该怎么做吧,要么就是我太弱了..先搞清楚这个题要求的是什么.从一个长字符串中找一个字串,这个字串中的字符全然包括了另一个给定目标串中的字 ...

  10. 《JAVA程序设计》实训第一天——《猜猜看》游戏

    课程实训是做一个猜猜看的小游戏.对于对代码不熟悉不了解的我来说的确挺难的.可是我还是会努力的. import java.awt.EventQueue; import javax.swing.JFram ...