CF1404D Game of Pairs

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

算法:构造

题目大意

题目链接

交互题。

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

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

如果所选出的数之和是(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))

代码略。

原文地址:https://www.cnblogs.com/dysyn1314/p/13626164.html