1 条题解

  • 0
    @ 2026-9-3 11:09:08

    模序列 题解

    思路

    令 r=x mod yr=x\bmod y,q=⌊x/y⌋q=\lfloor x/y\rfloor。所有合法元素与 xx 模 yy 同余,因此可以写成 ai=r+kiya_i=r+k_i y。其中 k1=qk_1=q,以后每一步把 kk 加一或清零。

    于是必须有 S−nr≥0S-nr\ge0 且能被 yy 整除。记

    K=S−nry.K=\frac{S-nr}{y}.

    问题变成构造长度为 nn、总和为 KK 的 kk 序列。序列由一个 q,q+1,…,q+p−1q,q+1,\ldots,q+p-1 的前缀,以及若干个 0,1,…,L−10,1,\ldots,L-1 的块组成。

    做法

    子任务 1 可以枚举后 n−1n-1 步选择“加一”还是“清零”,复杂度为 O(2n)O(2^n)。

    子任务 2 可以做位置动态规划。状态记录已经放置的元素数、当前 kik_i 与当前总和;从每个状态转移到 ki+1k_i+1 或 00。状态数为 O(nK2)O(nK^2),在该子任务限制内可通过。

    满分算法先计算 dp[v]:用若干个从零开始的块凑出和 vv 所需的最少元素数。长度为 LL 的块贡献

    0+1+⋯+(L−1)=L(L−1)20+1+\cdots+(L-1)=\frac{L(L-1)}2

    且使用 LL 个元素。因此

    dp[v]=min⁡(L2)≤v{dp[v−(L2)]+L}.dp[v]=\min_{\binom L2\le v}\{dp[v-\binom L2]+L\}.

    同时记录最后一个块的长度以便恢复方案。枚举第一个特殊前缀的长度 pp,其贡献为

    pq+p(p−1)2.pq+\frac{p(p-1)}2.

    若剩余值非负且 dp[剩余值] <= n-p,就恢复这些普通块,并用长度为一、贡献为零的块补足剩余位置。最后把每个 kik_i 还原成 r+kiyr+k_i y。

    正确性证明

    任意合法操作都保持元素模 yy 的余数为 rr,所以归一化后的转移恰为“加一”或“清零”。第一次清零前必形成从 qq 开始的连续递增前缀;以后每两次清零之间必形成从零开始的连续递增块。反之,任意这种分块都逐项满足合法转移。

    动态规划枚举了每个普通块的所有可能长度,并取实现给定和所需的最短总长度,所以 dp[v] 不超过可用位置数当且仅当普通块可以放入;多余位置可由单元素零块补齐。算法又枚举了特殊前缀的全部可能长度,故若存在合法序列必会找到,所恢复序列也必合法且总和为 SS。

    复杂度

    单个测试用例记归一化目标为 KK。动态规划复杂度为 O(KK)O(K\sqrt K),枚举与输出复杂度为 O(n)O(n),空间复杂度为 O(K)O(K)。由输入的总和限制,总复杂度可通过。

    • 1

    信息

    ID
    1439
    时间
    3000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者