• 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))

    代码略。

  • 相关阅读:
    查找oracle数据文件、表空间的位置
    select into 给多变量赋值
    关于Union 中 ORA-12704:字符集不匹配问题的解决
    weblogic线程阻塞性能调优(图解)
    window系统无法访问局域网内文件共享的问题
    查看oracle的sql语句历史记录和锁表的情况
    <c:forEach>标签的使用 JSTL
    CAS服务下单点登录(服务端与客户端)
    cas 配置数据源 , 解决CAS 不支持你提供的凭证 .
    信号量通俗释义
  • 原文地址:https://www.cnblogs.com/dysyn1314/p/13626164.html
Copyright © 2020-2023  润新知