Nim游戏 模板+拓展 博弈论+sg函数
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nim游戏 模板+拓展 博弈论+sg函数相关的知识,希望对你有一定的参考价值。
Nim游戏
思路:
先上结论: 对于 a 1 , a 2 , a 3 . . . a n − 1 , a n a_1,a_2,a_3...a_{n-1},a_{n} a1,a2,a3...an−1,an每堆石头
- 如果 a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n = 0 a_1\\oplus a_2 \\oplus a_3 \\oplus... \\oplus a_n = 0 a1⊕a2⊕a3⊕...⊕an=0一定先手必败
- 如果 a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n ≠ 0 a_1 \\oplus a_2 \\oplus a_3 \\oplus... \\oplus a_n \\neq 0 a1⊕a2⊕a3⊕...⊕an=0一定先手必胜
注意: ⊕ \\oplus ⊕为异或符号
开始证明:
- 当 a 1 , a 2 , a 3 . . . a n a_1 ,a_2 ,a_3...a_n a1,a2,a3...an都为0时,为失败状态,此时所有数相互异或结果为0
- 当
a
1
⊕
a
2
⊕
a
3
⊕
.
.
.
⊕
a
n
≠
0
a_1 \\oplus a_2 \\oplus a_3 \\oplus... \\oplus a_n \\neq 0
a1⊕a2⊕a3⊕...⊕an=0时
我们假设 a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n = x a_1\\oplus a_2 \\oplus a_3 \\oplus... \\oplus a_n = x a1⊕a2⊕a3⊕...⊕an=x
那么x最高位是1的二进制位上,必然存在一个数 a i a_i ai的这一位也是1,为什么呢?因为我们可以发现,在某个二进制位上,当存在奇数个1时(最后剩下一个1异或不掉,1异或0还是1嘛),结果就为1,存在偶数个1时(两个1互相异或,最后都为0),结果就为0
然后对于这个 a i a_i ai,得出结论 a i ⊕ x < a i a_i \\oplus x < a_i ai⊕x<ai, 因为 x x x的最高位为1, a i a_i ai对应位置也为1,异或一下,这位就变为0,那么数就变小了,不管后面的二进制位怎么异或,高位为1的二进制数始终大于低位全为1的二进制数(比如说1000大于0111,即16大于15)
然后我们就可以拿走一定数目的石头让这个数 a i a_i ai变成 a i ⊕ x a_i \\oplus x ai⊕x,
另一方 a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . a i ⊕ x . . . ⊕ a n = a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . a i . . . ⊕ a n ⊕ x = x ⊕ x = 0 a_1 \\oplus a_2 \\oplus a_3 \\oplus...a_i \\oplus x... \\oplus a_n = a_1 \\oplus a_2 \\oplus a_3 \\oplus...a_i ... \\oplus a_n \\oplus x = x\\oplus x =0 a1⊕a2⊕a3⊕...ai⊕x...⊕an=a1⊕a2⊕a3⊕...ai...⊕an⊕x=x⊕x=0,
那下一步就变为所有数的异或都不会为0,然后另一方必然取出些石头,使最后的异或不为0,那么先手就可以进行相同的操作了,最终先手始终是所有数异或不为0,后手始终异或为0,最终必然取完石子,异或为0的一定是后手。
故先手必胜 -
a
1
⊕
a
2
⊕
a
3
⊕
.
.
.
⊕
a
n
=
0
a_1\\oplus a_2 \\oplus a_3 \\oplus... \\oplus a_n = 0
a1⊕a2⊕a3⊕...⊕an=0时,怎样拿最后的异或都不会是0
反证法:
假设是0
a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . a i . . ⊕ a n = 0 a_1\\oplus a_2 \\oplus a_3 \\oplus...a_i.. \\oplus a_n = 0 a1⊕a2⊕a3⊕...ai..⊕an=0
a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . a i ′ . . ⊕ a n = 0 a_1\\oplus a_2 \\oplus a_3 \\oplus...a_i^{'}.. \\oplus a_n = 0 a1⊕a2⊕a3⊕...ai′..⊕博弈论 SG函数BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)