题解/算法 {892. 台阶-Nim游戏}
LINK: https://www.acwing.com/problem/content/description/894/
;
题解
设台阶编号为1,2,...,n
, 每一次操作 即将
i
i
i号台阶的若干石子 移动到
i
−
1
i-1
i−1台阶 (地面想象成是
0
0
0号台阶), 也就是: 每次操作的两个台阶 其奇偶性是不同的;
将所有台阶分为2类: (奇数集 1,3,5,...
)(偶数集 2,4,...
);
此时单独看某一个集合, 即从该集合里 扔掉>0
个石子, 这和
N
i
m
Nim
Nim游戏 是完全相同的!
.
但他俩不可以直接组合起来 成为一个组合游戏 (即奇数集的异或和 异或 偶数集的异或)! 因为他俩不是两个独立的游戏 (组合游戏的前提是: 各个子游戏是完全独立不影响的) 他俩是有联系的! 比如当前局面是O: [0], E: [1]
, 我对偶数集E操作之后 并不是变成了O[0], E[0]
, 而是O[1], E[0]
! 因此不可以将两者组合起来;
还是要进一步分析, 由于终止态只有1个前驱节点 即[>0, 0...0]
(也就是A1 > 0
), 而A1是在奇数集O里的, 因此分析奇数集O:
1:
如果他的异或和是
≠
0
\neq 0
=0, 则根据
N
i
m
Nim
Nim定理 (从奇数集中选择某个数 将他变小后 该集合的异或和会变成0): 先手操作后 一定可以将奇数集O的异或和 变成
0
0
0;
2:
否则, 此时奇数集的异或为
0
0
0 有2种可能的操作:
.
1:
操作奇数集 根据
N
i
m
Nim
Nim定理 新的奇数集的异或和
≠
0
\neq 0
=0
.
2:
操作偶数集 会导致使得奇数集某个元素变大, 因为此时奇数集的异或和为
0
0
0 让其中任意元素变大 会使得新奇数集的异或和
≠
0
\neq 0
=0);
总结:
如果奇数集O的异或和
≠
0
\neq 0
=0, 那么 先手一定可以使得: 新奇数集的异或和
=
0
=0
=0;
否则, 新奇数集的异或和一定会
>
0
>0
>0;
而终止态 对应的奇数异或和 = 0 =0 =0, 因此: 奇数集异或和 = 0 =0 =0 ⟺ \iff ⟺ 必败;