CF1404D Game of Pairs

题目来源:Codeforces Round #668 (Div. 1) CF1404 D题

算法:构造

题目大意

题目链接

交互题。

给定一个正整数\(n\)。两人玩一个游戏。游戏分为两个步骤:

  1. 先手把\(1,2,\dots ,2n\)这个\(2n\)个数,两两配对。
  2. 后手在每一对中,选择恰好一个数。

如果所选出的数之和是\(2n\)的倍数,则后手胜,否则先手胜。

给定\(n\)。请你自己选择做先手或后手,并给出必胜策略。

数据范围:\(1\leq n\leq 5\times 10^5\)

本题题解

part1:\(n\)是偶数时

引理1.1\(n\)是偶数时,先手必胜。

证明1.1

先手的配对策略是:\((1,n+1),(2,n+2),\dots ,(n,2n)\)

此时,每一对里的数,\(\bmod n\)的值分别是\(1,2,\dots ,n-1,0\)。所以无论怎么选,所选出的数之和,\(\bmod n\)都等于\(1+2+\dots +n-1=\frac{n(n-1)}{2}\)

\(n=2m\),则\(\frac{n(n-1)}{2}=\frac{2m(2m-1)}{2}=m(2m-1)\)

因为\(2m-1\)是个奇数,所以\(m(2m-1)\)一定不是\(n\)的倍数,因此也一定不是\(2n\)的倍数。

part2:\(n\)是奇数时

我们猜想,\(n\)是奇数时后手必胜。现在需要通过构造出后手的策略,来证明这个猜想。

引理2.1\(n\)是奇数时,后手想要获胜,只需要构造出一种方案,使得所选的数之和是\(n\)的倍数即可。

也就是说,这个引理,将后手获胜的条件从“是\(2n\)的倍数”,弱化到了“是\(n\)的倍数”。那么其中必定有一种奇妙的构造方法,当知道了一个“和是\(n\)的倍数的方案”后,能立刻在此基础上构造出“和是\(2n\)倍数的方案”。

证明2.1

\(n\)是奇数时,所有数之和\(1+2+\dots +2n=n(2n+1)\)

因为\(2n+1\)是个奇数,所以\(n(2n+1)\equiv n\pmod{2n}\)。也就是说,所有数之和,\(\bmod 2n\)的余数是\(n\)

现在,假如我们知道了一种“和是\(n\)的倍数的选择方案”。那这个和在\(\bmod 2n\)的意义下,要么余\(0\),要么余\(n\)

  • 如果余\(0\),则我们已经构造出了“和是\(2n\)倍数的方案”。
  • 如果余\(n\),则未被选中的数之和,\(\bmod 2n\)一定余\(0\)。我们选所有当前未被选中的数,就能得到一个“和是\(2n\)倍数的方案”。

引理2.2:无论先手怎么分组,总存在一种方案,使得\(\bmod n=0,1,\dots,n-1\)的数各被选中一次。

此时所有选中的数之和,在\(\bmod n\)意义下就是\(1+2+\dots +n-1=\frac{n(n-1)}{2}\),一定是\(n\)的倍数。

证明2.2

先随便选一个\(\bmod n=0\)的数(也就是\(n\)\(2n\))。假设与它配对的数\(\bmod n=x\)。再选另一个\(\bmod n=x\)的数。再把与新选的数配对的数抛弃掉,选一个与之同余的......。直到某一次被抛弃掉的数,就是另一个\(\bmod n=0\)的数,那么当前所选的数就形成了一个闭环。同理,剩下的数也一定是若干个闭环,每个环相互独立,我们各个击破即可。

更形式化地说,我们其实是建了一张无向图。有\(n\)个节点,标号\(0,1,\dots ,n-1\)。如果\((x,y)\)配对,就在\(x\bmod n\)\(y\bmod n\)之间连一条边。因为每个点度数都是\(2\),所以整张图一定是若干个环。

结合引理2.2和引理2.1,就在\(n\)为奇数时构造出了一种后手必胜的方案。

时间复杂度\(O(n)\)

代码略。

posted @ 2020-09-07 12:31  duyiblue  阅读(344)  评论(3编辑  收藏  举报