EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P3235 [HNOI2014] 江南乐

$$ \def\xor{\text{ xor }} \def\mex{\mathrm{mex}} \def\SG{\mathrm{SG}} $$

题目描述

小 A 是一个名副其实的狂热的回合制游戏玩家。在获得了许多回合制游戏的世界级奖项之后,小 A 有一天突然想起了他小时候在江南玩过的一个回合制游戏。

游戏的规则是这样的,首先给定一个数 $F$,然后游戏系统会产生 $T$ 组游戏。每一组游戏包含 $N$ 堆石子,小 A 和他的对手轮流操作。每次操作时,操作者先选定一个不小于 $2$ 的正整数 $M$($M$ 是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于 $F$ 的石子分成 $M$ 堆,并且满足这 $M$ 堆石子中石子数最多的一堆至多比石子数最少的一堆多 $1$(即分的尽量平均,事实上按照这样的分石子万法,选定 $M$ 和一堆石子后,它分出来的状态是固定的)。当一个玩家不能操作的时候,也就是当每一堆石子的数量都严格小于 $F$ 时,他就输掉。补充:先手从 $N$ 堆石子中选择一堆数量不小于 $F$ 的石子分成 $M$ 堆后,此时共有 $N+M-1$ 堆石子,接下来小 A 从这 $N+M-1$ 堆石子中选择一堆数量不小于 $F$ 的石子,依此类推。

小 A 从小就是个有风度的男生,他邀请他的对手作为先手。小 A 现在想要知道,面对给定的一组游戏,而且他的对手也和他一样聪明绝顶的话,究竟谁能够获得胜利?

输入格式

输入第一行包含两个正整数 $T$ 和 $F$,分别表示游戏组数与给定的数。

接下来 $T$ 行,每行第一个数 $N$ 表示该组游戏初始状态下有多少堆石子。之后 $N$ 个正整数,表示这 $N$ 堆石子分别有多少个。

输出格式

输出一行,包含 $T$ 个用空格隔开的 $0$ 或 $1$ 的数,其中 $0$ 代表此时小 A(后手)会胜利,而 $1$ 代表小 A 的对手(先手)会胜利。

输入输出样例 #1

输入 #1

1
2
3
4
5
4 3
1 1
1 2
1 3
1 5

输出 #1

1
0 0 1 1

说明/提示

对于 $100%$ 的数据,$T \lt 100$,$N \lt 100$,$F \lt 100000$,每堆石子数量${}\lt 100000$。

以上所有数均为正整数。

题解

若一堆石子有 $x$ 个,分成 $m$ 堆后,必然有 $x \mod m$ 堆是 $\lfloor \frac{x}{m} \rfloor$ 个,有 $m - x \mod m$ 堆是 $\lfloor \frac{x}{m} \rfloor + 1$ 个。这些堆的 SG 函数的异或和就是 $\SG(x)$。该算法时间复杂度为 $O(n^2)$。

考虑到偶数个相同的数的异或和为 0,因此只要考虑 $x \mod m$ 和 $m - x \mod m$ 的奇偶性即可。

对于某些不同的 $m$,有 $\lfloor \frac{x}{m} \rfloor$ 的值相同,使用整除分块可以对上述方案进行优化。

接下来是打表找规律。当 $x = 5$ 时,对于不同的 $m$,列出分堆后的石子堆:

1
2
3
4
5
5 : 2 2 2 2 1           
6 : 2 2 2 1 1 1
7 : 2 2 1 1 1 1 1
8 : 2 1 1 1 1 1 1 1
9 : 1 1 1 1 1 1 1 1 1

发现其中大小为 1 的石子堆数总是奇数个。

推论:分堆后某一个数目的石子堆数的奇偶性是一定的。可以分类证明。

  • 若 $\lfloor \frac{x}{m} \rfloor$ 为奇数,则 $m - x \mod m = m \times (1 + \lfloor \frac{x}{m} \rfloor) - x$。其中 $1 + \lfloor \frac{x}{m} \rfloor$ 为偶数,则 $m \times (1 + \lfloor \frac{x}{m} \rfloor)$ 也为偶数,原式奇偶性与 $m$ 无关。
  • 若 $\lfloor \frac{x}{m} \rfloor$ 为偶数,则 $x \mod m = x - m \times \lfloor \frac{x}{m} \rfloor$。其中 $\lfloor \frac{x}{m} \rfloor$ 为偶数,则 $m \times \lfloor \frac{x}{m} \rfloor$ 也为偶数,原式奇偶性与 $m$ 无关。

按照 $\lfloor \frac{x}{m} \rfloor$ 分块后,块内分出的石子数的两种取值的个数的奇偶性的组合只有两种。例如 $x=9,m=5$ 时,1 的个数总是为奇数,2 的个数为奇数或偶数。

块内只需算出这两种不同的 SG 异或和即可。