EagleBear2002 的博客

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

P3235 [HNOI2014] 江南乐

题目描述

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

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

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

输入格式

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

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

输出格式

输出一行,包含 T 个用空格隔开的 01 的数,其中 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<100N<100F<100000,每堆石子数量<100000

以上所有数均为正整数。

题解

若一堆石子有 x 个,分成 m 堆后,必然有 xmodm 堆是 xm 个,有 mxmodm 堆是 xm+1 个。这些堆的 SG 函数的异或和就是 SG(x)。该算法时间复杂度为 O(n2)

考虑到偶数个相同的数的异或和为 0,因此只要考虑 xmodmmxmodm 的奇偶性即可。

对于某些不同的 m,有 xm 的值相同,使用整除分块可以对上述方案进行优化。

接下来是打表找规律。当 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 的石子堆数总是奇数个。

推论:分堆后某一个数目的石子堆数的奇偶性是一定的,证明:打表找规律

  • xm 为奇数,则 mxmodm=m×(1+xm)i。其中 1+xm 为偶数,则 m×(1+xm) 也为偶数,原式奇偶性与 m 无关。
  • xm 为偶数,则 xmodm=xm×xm。其中 m×xm 为偶数,则 m×xm 也为偶数,原式奇偶性与 m 无关。

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

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