1 条题解

  • 0
    @ 2026-8-23 21:03:55

    题解

    思路

    序列 ff 满足 mm 阶线性递推 f(x)=d=1mf(xd)f(x)=\sum_{d=1}^m f(x-d)。设其转移矩阵为 TT,则一次切分中各段数值之和为 xx 时,贡献由 TxT^x 决定。矩阵幂满足 Tx1++xt=Tx1TxtT^{x_1+\cdots+x_t}=T^{x_1}\cdots T^{x_t},因此可以直接对所有切分的矩阵幂求和。

    做法

    DiD_i 为前 ii 个字符所有切分对应的 T段和T^{\text{段和}} 之和,D0=ID_0=I。若最后一段为 s[ji1]s[j\ldots i-1],其十进制值为 vv,则

    Di+=DjTv.D_i\mathrel{+}=D_jT^v.

    从左到右扩展一个十进制数时,若旧值为 vv、新数字为 dd,则

    T10v+d=(Tv)10Td.T^{10v+d}=(T^v)^{10}T^d.

    部分分

    m=1m=1 时恒有 f(x)=1f(x)=1,答案只等于切分数 2s12^{|s|-1}。当 s15|s|\le15 时可以枚举所有切分。当 s100|s|\le100 时可直接使用至多 5×55\times5 的矩阵完成上述 DP。

    商环优化

    矩阵 TT 的特征关系为

    Xm=Xm1+Xm2++1.X^m=X^{m-1}+X^{m-2}+\cdots+1.

    因此任意 TvT^v 都能唯一表示为次数小于 mm 的多项式。两个多项式相乘后,把每个 Xd (dm)X^d\ (d\ge m) 按上式从高次向低次消去即可。一次乘法只需 O(m2)O(m^2),而十次幂可由平方得到。

    最终 Dn=t=0m1ctTtD_n=\sum_{t=0}^{m-1}c_tT^t。预先计算 f(0),,f(m1)f(0),\ldots,f(m-1),答案就是 ctf(t)\sum c_tf(t)

    正确性

    每个切分有唯一的最后一段起点 jj。归纳假设 DjD_j 恰好包含前缀的全部切分,右乘最后一段的 TvT^v 后指数相加,恰好得到完整切分的段和;对所有 jj 累加既无遗漏也无重复。商环化简只使用转移矩阵满足的特征关系,不改变矩阵值,因此最终线性函数给出的就是所有 f(x)f(x) 之和。

    复杂度

    共有 O(n2)O(n^2) 个最后段转移,每次多项式运算为 O(m2)O(m^2),总时间复杂度 O(n2m2)O(n^2m^2),空间复杂度 O(nm)O(nm)

    • 1

    信息

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