题目

\(n\) 堆石子,已知每堆石子的数量都介于 \([1,2^m-1]\) 之间且互不相同。每堆石子中的数量可以任选(但必须满足上述要求),求有多少种方案可以使得 \(\text{Nim}\) 游戏下先手取胜。

答案模 \(10^9+7\)

\(n\le10^7\)

解法

算后手必胜的情况。

如果不要求互不相同也不要求非 \(0\),那么答案显然就是前面的任选,最后一个是前面的异或和。

如果要求非 \(0\),设 \(f(i)\) 表示 \(i\) 堆石子的答案,那么显然有 \(f(i)=(2^m-1)^{i-1}-f(i-1)\),即前面 \(i-1\) 位任选减掉最后一位恰好是 \(0\) 的答案(前 \(i-1\) 位异或和为 \(0\),要使前 \(i\) 位异或和为 \(0\),第 \(i\) 位只能是 \(0\))。

如果再加上互不相同的限制,仍然前面 \(i-1\) 位任选,减掉第 \(i\) 位为 \(0\) 的情况以及第 \(i\) 位和之前某位相等的情况即可(由于前面互不相同,因此只有一个位置与其相等)。

\[f(i)=(2^m-1)(2^m-2)…(2^m-i+1)-f(i-1)-(2^m-i+1)(i-1)f(i-2) \]

最后 \((2^m-1)(2^m-2)…(2^m-n)-f(n)\) 即为答案。

复杂度 \(\mathcal O(n)\)

posted on 2021-02-15 17:38  Oxide  阅读(26)  评论(0编辑  收藏  举报