题目来源:Codeforces Round #668 (Div. 1) CF1404 D题
算法:构造
题目大意
交互题。
给定一个正整数(n)。两人玩一个游戏。游戏分为两个步骤:
- 先手把(1,2,dots ,2n)这个(2n)个数,两两配对。
- 后手在每一对中,选择恰好一个数。
如果所选出的数之和是(2n)的倍数,则后手胜,否则先手胜。
给定(n)。请你自己选择做先手或后手,并给出必胜策略。
数据范围:(1leq nleq 5 imes 10^5)。
本题题解
part1:(n)是偶数时
引理1.1:(n)是偶数时,先手必胜。
证明1.1:
先手的配对策略是:((1,n+1),(2,n+2),dots ,(n,2n))。
此时,每一对里的数,(mod n)的值分别是(1,2,dots ,n-1,0)。所以无论怎么选,所选出的数之和,(mod 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 npmod{2n})。也就是说,所有数之和,(mod 2n)的余数是(n)。
现在,假如我们知道了一种“和是(n)的倍数的选择方案”。那这个和在(mod 2n)的意义下,要么余(0),要么余(n)。
- 如果余(0),则我们已经构造出了“和是(2n)倍数的方案”。
- 如果余(n),则未被选中的数之和,(mod 2n)一定余(0)。我们选所有当前未被选中的数,就能得到一个“和是(2n)倍数的方案”。
引理2.2:无论先手怎么分组,总存在一种方案,使得(mod n=0,1,dots,n-1)的数各被选中一次。
此时所有选中的数之和,在(mod n)意义下就是(1+2+dots +n-1=frac{n(n-1)}{2}),一定是(n)的倍数。
证明2.2:
先随便选一个(mod n=0)的数(也就是(n)或(2n))。假设与它配对的数(mod n=x)。再选另一个(mod n=x)的数。再把与新选的数配对的数抛弃掉,选一个与之同余的......。直到某一次被抛弃掉的数,就是另一个(mod n=0)的数,那么当前所选的数就形成了一个闭环。同理,剩下的数也一定是若干个闭环,每个环相互独立,我们各个击破即可。
更形式化地说,我们其实是建了一张无向图。有(n)个节点,标号(0,1,dots ,n-1)。如果((x,y))配对,就在(xmod n)和(ymod n)之间连一条边。因为每个点度数都是(2),所以整张图一定是若干个环。
结合引理2.2和引理2.1,就在(n)为奇数时构造出了一种后手必胜的方案。
时间复杂度(O(n))。
代码略。