CF1404D Game of Pairs
题目来源:Codeforces Round #668 (Div. 1) CF1404 D题
算法:构造
题目大意
交互题。
给定一个正整数\(n\)。两人玩一个游戏。游戏分为两个步骤:
- 先手把\(1,2,\dots ,2n\)这个\(2n\)个数,两两配对。
- 后手在每一对中,选择恰好一个数。
如果所选出的数之和是\(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)\)。
代码略。