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^2\log M)\) , 如果精细实现可以强行卡掉这个 \(\log\)


D


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

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

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

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

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

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

复杂度\(\Theta(\sum n)\) .


E

F

posted @ 2020-10-11 23:55  srf  阅读(391)  评论(0编辑  收藏  举报