1 条题解

  • 0
    @ 2026-9-3 11:13:07

    题解

    思路

    处理一个普通序列时,令 cntccnt_c 表示当前所有不同非空子序列中,以符号 cc 结尾的数量,并令

    T=1+∑c=0k−1cntcT=1+\sum_{c=0}^{k-1}cnt_c

    包含空序列。追加符号 cc 后,所有旧子序列都可以追加这个符号,因而新的 cntccnt_c 恰为旧的 TT,其他坐标不变。这是一个 (k+1)(k+1) 维向量的线性变换,最后一个坐标固定为 11。

    另一方面,长度为 kmk^m 的数位和模 kk 序列可以按最高位拆成 kk 个长度为 km−1k^{m-1} 的块;第 dd 块就是基础块的所有符号整体加 dd 再模 kk。

    做法

    子任务 1:显式生成

    逐个枚举 j=0,1,…,n−1j=0,1,\ldots,n-1,计算其 kk 进制数位和模 kk,再按上面的 cntcnt 递推更新。时间 O(nlog⁡kn)O(n\log_k n),空间 O(k)O(k)。

    子任务 2:朴素块矩阵

    令 Am,xA_{m,x} 表示长度为 kmk^m、所有符号整体增加 xx 的块对应的矩阵。A0,xA_{0,x} 就是追加单个符号 xx 的矩阵。

    从第 m−1m-1 层计算第 mm 层时,对每个偏移 xx 依次乘上 kk 个子块矩阵。这样每层需要 k2k^2 次矩阵乘法,适合 k≤8k\le8。再按 nn 的 kk 进制前缀分解乘出长度为 nn 的矩阵。

    子任务 3:前后缀积优化

    对固定一层的 Am−1,0,…,Am−1,k−1A_{m-1,0},\ldots,A_{m-1,k-1},预处理块序列的所有前缀矩阵积 PxP_x 和后缀矩阵积 SxS_x。偏移为 xx 的完整循环块由区间 [x,k−1][x,k-1] 后接 [0,x−1][0,x-1],所以只需一次矩阵乘法即可由 Px,SxP_x,S_x 得到 Am,xA_{m,x}。

    每层由 k2k^2 次矩阵乘法降为 O(k)O(k) 次。最后递归处理长度 nn 的前缀:每层先合并若干完整子块,再进入唯一的残缺子块。

    矩阵乘法的单个元素用 128 位整数累加后统一取模,避免 64 位累加溢出。

    复杂度

    • 子任务 1:时间 O(nlog⁡kn)O(n\log_k n),空间 O(k)O(k)。
    • 子任务 2:时间 O(k5log⁡kn)O(k^5\log_k n),空间 O(k3log⁡kn)O(k^3\log_k n)。
    • 满分算法:时间 O(k4log⁡kn)O(k^4\log_k n),空间 O(k3log⁡kn)O(k^3\log_k n)。
    • 1

    信息

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