1 条题解

  • 0
    @ 2025-10-30 10:50:31

    题目理解

    我们有一个长度为 NN 的数字字符串 SS,和一个素数 PP。对于每个询问 [fr,to][fr, to],我们需要计算子串 S[frto]S[fr \ldots to] 中有多少个子串(连续)表示的数是 PP 的倍数。

    关键观察

    • 子串 S[lr]S[l \ldots r] 表示的数字是 i=lrS[i]×10ri\sum_{i=l}^r S[i] \times 10^{r-i}
    • 由于 PP 是素数,当 P2,5P \neq 2, 5 时,1010PP 互质,有乘法逆元
    • P=2P = 2P=5P = 5 时,情况特殊,可以单独处理

    问题分析

    情况1:P=2P = 2P=5P = 5

    这种情况下,一个数能被 PP 整除当且仅当最后一位能被 PP 整除。

    解法

    • 预处理前缀和数组
    • 对于询问 [l,r][l, r],答案为 $\sum_{i=l}^r [S[i] \equiv 0 \pmod{P}] \times (i-l+1)$

    情况2:P2,5P \neq 2, 5

    这是本题的主要难点。

    解法思路

    关键转化

    f(i)f(i) 表示后缀 S[iN]S[i \ldots N] 表示的数字模 PP 的值:

    $$f(i) = \left(\sum_{j=i}^N S[j] \times 10^{N-j}\right) \bmod P $$

    那么子串 S[lr]S[l \ldots r] 表示的数字为:

    f(l)f(r+1)10NrmodP\frac{f(l) - f(r+1)}{10^{N-r}} \bmod P

    由于 P2,5P \neq 2, 51010PP 互质,10Nr10^{N-r} 有逆元,所以:

    $$S[l \ldots r] \equiv 0 \pmod{P} \iff f(l) \equiv f(r+1) \pmod{P} $$

    问题转化

    对于询问 [l,r][l, r],我们要求满足:

    • lijrl \leq i \leq j \leq r
    • f(i)f(j+1)(modP)f(i) \equiv f(j+1) \pmod{P}

    的子串 S[ij]S[i \ldots j] 的个数。

    这等价于在区间 [l,r+1][l, r+1] 中,有多少对 (i,j)(i, j) 满足 f(i)=f(j)f(i) = f(j)i<ji < j

    莫队算法

    将问题转化为:有 n+1n+1 个位置(f(1)f(n+1)f(1) \ldots f(n+1)),每个位置有一个值,询问区间 [l,r][l, r] 内相同值的对数。

    使用莫队算法:

    • 将询问按块排序
    • 维护当前区间内每个值的出现次数
    • 移动指针时更新答案

    算法复杂度分析

    特殊情况(P=2,5P = 2, 5

    • 预处理O(n)O(n)
    • 每次查询O(1)O(1)
    • 总复杂度O(n+m)O(n + m)

    一般情况(P2,5P \neq 2, 5

    • 预处理
      • 计算幂次:O(n)O(n)
      • 计算后缀值:O(n)O(n)
      • 离散化:O(nlogn)O(n \log n)
    • 莫队算法O(nm)O(n \sqrt{m})
    • 总复杂度O(nlogn+nm)O(n \log n + n \sqrt{m})

    关键技巧总结

    1. 数学转化:利用后缀表示将子串整除问题转化为值相等问题
    2. 特殊情况处理P=2,5P = 2, 5 时性质特殊,单独处理
    3. 离散化:将大范围的模P值映射到小范围,便于计数
    4. 莫队算法:高效处理区间内相同值对数的查询
    5. 边界处理:注意f数组有n+1n+1个值,询问区间要相应调整

    正确性证明

    对于子串 S[ij]S[i \ldots j]

    • 其数值 = f(i)f(j+1)10NjmodP\frac{f(i) - f(j+1)}{10^{N-j}} \bmod P
    • 由于 10Nj10^{N-j}PP 互质,该值为0当且仅当 f(i)f(j+1)(modP)f(i) \equiv f(j+1) \pmod{P}
    • 因此统计区间 [l,r+1][l, r+1] 内相同f值的对数即为答案

    这种方法充分利用了数论性质和算法技巧,将复杂的子串统计问题转化为高效的区间查询问题。

    • 1

    信息

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