题目描述
小 A 是一个名副其实的狂热的回合制游戏玩家。在获得了许多回合制游戏的世界级奖项之后,小 A 有一天突然想起了他小时候在江南玩过的一个回合制游戏。
游戏的规则是这样的,首先给定一个数 ,然后游戏系统会产生 组游戏。每一组游戏包含 堆石子,小 A 和他的对手轮流操作。每次操作时,操作者先选定一个不小于 的正整数 ( 是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于 的石子分成 堆,并且满足这 堆石子中石子数最多的一堆至多比石子数最少的一堆多 (即分的尽量平均,事实上按照这样的分石子万法,选定 和一堆石子后,它分出来的状态是固定的)。当一个玩家不能操作的时候,也就是当每一堆石子的数量都严格小于 时,他就输掉。补充:先手从 堆石子中选择一堆数量不小于 的石子分成 堆后,此时共有 堆石子,接下来小 A 从这 堆石子中选择一堆数量不小于 的石子,依此类推。
小 A 从小就是个有风度的男生,他邀请他的对手作为先手。小 A 现在想要知道,面对给定的一组游戏,而且他的对手也和他一样聪明绝顶的话,究竟谁能够获得胜利?
输入格式
输入第一行包含两个正整数 和 ,分别表示游戏组数与给定的数。
接下来 行,每行第一个数 表示该组游戏初始状态下有多少堆石子。之后 个正整数,表示这 堆石子分别有多少个。
输出格式
输出一行,包含 个用空格隔开的 或 的数,其中 代表此时小 A(后手)会胜利,而 代表小 A 的对手(先手)会胜利。
输入输出样例 #1
输入 #1
输出 #1
说明/提示
对于 的数据,,,,每堆石子数量。
以上所有数均为正整数。
题解
若一堆石子有 个,分成 堆后,必然有 堆是 个,有 堆是 个。这些堆的 SG 函数的异或和就是 。该算法时间复杂度为 。
考虑到偶数个相同的数的异或和为 0,因此只要考虑 和 的奇偶性即可。
对于某些不同的 ,有 的值相同,使用整除分块可以对上述方案进行优化。
接下来是打表找规律。当 时,对于不同的 ,列出分堆后的石子堆:
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 的石子堆数总是奇数个。
推论:分堆后某一个数目的石子堆数的奇偶性是一定的,证明:打表找规律。
- 若 为奇数,则 。其中 为偶数,则 也为偶数,原式奇偶性与 无关。
- 若 为偶数,则 。其中 为偶数,则 也为偶数,原式奇偶性与 无关。
按照 分块后,块内分出的石子数的两种取值的个数的奇偶性的组合只有两种。例如 时,1 的个数总是为奇数,2 的个数为奇数或偶数。
块内只需算出这两种不同的 SG 异或和即可。