1 条题解

  • 0
    @ 2026-8-24 3:48:17

    [AHOI2005] 洗牌题解

    思路

    观察一张原来位于第 ii 个位置的牌。若它在上半叠,洗牌后位于第 2i2i 个位置;若它在下半叠,洗牌后位于第 2iN12i-N-1 个位置。两种情况可以统一写成

    i2i(modN+1).i'\equiv 2i\pmod{N+1}.

    所有实际位置都在 11NN 之间,因此不会出现模意义下的零。洗牌 MM 次后,原位置 ii 会到达

    i2M(modN+1).i\cdot 2^M\pmod{N+1}.

    题目给出的是最终位置 LL,要求原来的牌号,所以需要乘上 2M2^M 的逆元。由于 NN 为偶数,N+1N+1 为奇数,22 一定可逆,而且

    21N+22(modN+1).2^{-1}\equiv\frac{N+2}{2}\pmod{N+1}.

    于是答案为

    L(N+22)Mmod(N+1).L\left(\frac{N+2}{2}\right)^M\bmod(N+1).

    做法

    使用二进制快速幂计算 ((N+2)/2)Mmod(N+1)((N+2)/2)^M\bmod(N+1),再乘以 LL 并取模。乘法的两个因子都可能接近 101010^{10},中间结果使用 128 位整数。

    第一档可以每次根据当前位置的奇偶性逆推一次洗牌前的位置,共执行 MM 次。第二档把逆位置映射看作一个置换,从 LL 出发找到所在环的长度,将 MM 对环长取模后再沿环移动;由于环长不超过 NN,总操作数是线性的。满分做法不依赖 NNMM 的线性大小。

    正确性由位置映射直接得到:一次洗牌的正向映射等价于模 N+1N+1 乘二,连续 MM 次等价于乘 2M2^M。乘以其逆元恰好从最终位置恢复唯一的原位置,而初始牌号等于原位置,因此公式输出的就是所求牌号。

    复杂度

    满分算法的时间复杂度为 O(logM)O(\log M),额外空间复杂度为 O(1)O(1)

    • 1

    信息

    ID
    1018
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者