[组合计数题单]先手!先手!

只有 \(DP\) 不会,不会就是不会,怎么学都不会......

壹、题目

\(n\) 堆石子,每堆石子的数量都在 \([1,2^m-1]\) 之间且互不相同。

给定 \(n,m\),每堆石子数量任取,问有多少方案使得在 \(\tt nim\) 游戏下先手必胜。

贰、题解

考虑正难则反,在 \(\tt nim\) 游戏中,后手必胜当且仅当所有石子异或和为 \(0\),这个比先手胜更方便统计。

考虑较简单的情况,如果没有 "互不相同" 怎么做?考虑 \(DP\),定义 \(f_i\) 表示前 \(i\) 堆石子,后手取胜的情况,那么就有

\[f_i=(2^m-1)^{i-1}-f_{i-1} \]

即前 \(i-1\) 堆石子任取,最后一堆石子只需要取 \(\oplus_{j=1}^{i-1}a_j\) 即可,但是要去掉 \(\oplus_{j=1}^{i-1}a_j=0\) 的情况,这就是 \(f_{i-1}\).

现在要求各不相同,我们还是用这个状态,那么转移时我们除了去掉 \(\oplus_{j=1}^{i-1}a_j=0\) 的情况,还得去掉 \(a_i\) 与前面某些数字相同的情况。

考虑后者如何去掉,如果有两个数相同,那么他们的异或和一定为 \(0\),也就是说剩下的 \(i-2\) 个数字的异或和必然也为 \(0\),而我们当前的位置有 \(2^m-1\) 种数字选择,而和他相同的位置有 \(i-1\) 个,所以这部分就是 \((2^m-i+1)(i-1)f_{i-2}\),为什么是这个,因为 \(a_k=a_i\) 的取值有 \(2^m-1-(i-2)=2^m-i+1\) 种(不能和前面的取值相同),至于从位置考虑,由于我们前面的方案已经去重了,所以这样是不会少算、多算的。

\[f_i=\prod_{j=1}^{i-1}(2^m-j)-f_{i-1}-(2^m-i+1)(i-1)f_{i-2} \]

叁、用到の小 \(\tt trick\)

正难则反,由于后手必胜是异或和为 \(0\),较先手更好统计,所以我们从后手胜入手。

从简单想起,此题题目要求两个条件 —— 同时满足 \(a_i\in[1,2^m-1]\)(也就是非零)以及互不相同,那么我们就考虑先去掉互不相同的情况,最后再加上这个限制.

posted @ 2021-02-15 11:34  Arextre  阅读(76)  评论(0编辑  收藏  举报