AtCoder Regular Contest 105 题解

A


计算 (tot = frac{a+b+c+d}{2}) , 枚举子集判断是否相等即可。

(Theta(1))


B


不难发现这个过程的结果类似辗转相减,并且结果一定是所有数 (gcd) 的倍数,也一定是所有数 (gcd) 的约数。

所以结果自然就是所有数的 (gcd) 了。

(Theta(n log a_i))


C


枚举 (Theta(N!)) 种骆驼的排列方式,然后直接贪心即可。

(Theta(N!N^2log M)) , 如果精细实现可以强行卡掉这个 (log)


D


不难发现放完硬币之后就变成了一个 ( exttt{Nim}) 游戏,而这个 ( exttt{Nim}) 游戏的先后手不知道,所以考虑分类讨论。

(N) 为偶数时,第一个人在 ( exttt{Nim}) 游戏中是先手,所以他的目标是让 ( exttt{Nim}) 游戏的 (SG) 值为非零数。

首先如果所有的 (a_i) 都是成对出现的,也就是说每种数的出现次数都是偶数次,那么第二个人可以复制第一个人的所有操作,进而保证 ( exttt{Nim}) 游戏的 (SG) 值为 (0) , 那么第一个人就输了。

否则第一个人一定能赢,具体策略是一直把当前还没有放过的最大值丢到一个堆里,这样的话就能保证 ( exttt{Nim}) 游戏中有一个堆的总和 (>) 所有硬币数目的一半 ,那么怎么异或都不可能到达 0 了。

(N) 为奇数时,第一个人在 ( exttt{Nim}) 游戏中是后手,所以他的目标是让 ( exttt{Nim}) 游戏的 (SG) 值为零。

这时候不管怎么样第一个人一定会输,第二个人只要一直取当前没放过的 (a_i) 中的最大值加到第一个人一开始放的堆里即可保证这个堆的总和 (>) 所有硬币数目的一半,那么第一个人就输了。

复杂度(Theta(sum n)) .


E

F

原文地址:https://www.cnblogs.com/s-r-f/p/13800431.html