1 条题解

  • 0
    @ 2026-8-28 1:28:46

    题解

    思路

    一次操作对每一位独立生效,所以只需知道单个数字经过若干次操作后会产生多少位。数字尚未越过 99 时只会加一;越过 99 时会分裂为 11 和 00,之后两部分继续独立演化。

    令 fxf_x 表示从数字 00 开始连续增加 xx 次后得到的长度。当 x<10x<10 时长度为 11; 当 x≥10x\ge10 时,第一次越过 99 后产生的 11 和 00 分别还需演化 x−10x-10 次,因此可得到 fx=fx−9+fx−10f_x=f_{x-9}+f_{x-10}。

    原数中的一位 dd 经过 mm 次操作,等价于数字 00 经过 m+dm+d 次增加,所以其贡献为 fm+df_{m+d}。

    做法

    预处理 f0f_0 到 f200009f_{200009}。对每组输入枚举 nn 的十进制数字,把每一位对应的 fm+df_{m+d} 相加并取模。

    正确性证明

    每次操作对各位分别替换,任何一位产生的新数字也只由这一位的后续演化决定,因此总长度等于 所有初始位贡献之和。

    对单个初始数字,若总增量不足 1010,它始终是一位,故初值正确。若总增量至少为 1010,越过 99 时恰好分裂为 11 与 00;两部分剩余演化次数分别对应递推式中的 fx−9f_{x-9} 与 fx−10f_{x-10}。由归纳法,递推值等于真实长度。于是逐位相加得到的就是整串最终长度。

    复杂度

    预处理时间复杂度为 O(M)O(M),其中 M=2⋅105M=2\cdot10^5。每组测试只枚举至多十个十进制位, 总时间复杂度为 O(M+tlog⁡n)O(M+t\log n),空间复杂度为 O(M)O(M)。

    • 1

    信息

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