「CodeTON Round 8」E.Farm Game

这道题的难点和有意思的点在于博弈论这一块儿,其他的比如组合数学,其实是很偏板子的,所以我们主要讨论博弈论。

不失一般性,假设第一个牛是 FJ 的,然后我们得到牛的序列 \(a_1,b_1,a_2,b_2,\cdots,a_n,b_n\),然后设 \(d_1\)\(a_1\)\(b_1\) 之间的距离,\(d_2 \sim d_n\) 类似得出。我们发现如果想要让游戏胜负已定,其实就是让所有的 \(d_i\) 都为 \(0\) 即可,这时候虽然有可能有的牛可以移动,但他移动后他旁边的牛直接去到他移动前的位置即可,最后一定会某个操作者的所有牛无法移动。所以我们只要知道了谁在移动之后使得所有的 \(d_i\) 都为 \(0\),我们就知道了谁会赢。

我们思考一个常识,\(0\) 是偶数。因此,对于一个人(我们提前称他为失败者)来说,如果当前所有 \(d_i\) 都为偶数,那么他不管怎么移动牛们,牛们旁边的牛总能再次移动,使得这些 \(d_i\) 重新变为偶数。这些 \(d_i\) 会越来越小,因为失败者对面的人(我们提前称他为胜利者)一定有办法让这些 \(d_i\) 不变或变小,最终,所有的 \(d_i\) 都变为了最小的偶数 \(0\),我们可以正式宣布输赢了。

既然一个人面对所有 \(d_i\) 是偶数的情况时会失败,那么我们初始局面只要不让 FJ 面临这样的情况,他就可以把局面转化成这样的情况,留给 FN 处理。

这时候的计算就十分简单了,只要枚举 \(d_i\) 的总和,然后利用插板法和简单的组合数运算就可以了,详见代码。

Code

posted @ 2024-04-01 21:11  cndark_moon  阅读(23)  评论(0)    收藏  举报