1 条题解
-
0
题目理解
我们有一个长度为 的数字字符串 ,和一个素数 。对于每个询问 ,我们需要计算子串 中有多少个子串(连续)表示的数是 的倍数。
关键观察:
- 子串 表示的数字是
- 由于 是素数,当 时, 与 互质,有乘法逆元
- 当 或 时,情况特殊,可以单独处理
问题分析
情况1: 或
这种情况下,一个数能被 整除当且仅当最后一位能被 整除。
解法:
- 预处理前缀和数组
- 对于询问 ,答案为 $\sum_{i=l}^r [S[i] \equiv 0 \pmod{P}] \times (i-l+1)$
情况2:
这是本题的主要难点。
解法思路
关键转化
设 表示后缀 表示的数字模 的值:
$$f(i) = \left(\sum_{j=i}^N S[j] \times 10^{N-j}\right) \bmod P $$那么子串 表示的数字为:
由于 , 与 互质, 有逆元,所以:
$$S[l \ldots r] \equiv 0 \pmod{P} \iff f(l) \equiv f(r+1) \pmod{P} $$问题转化
对于询问 ,我们要求满足:
的子串 的个数。
这等价于在区间 中,有多少对 满足 且 。
莫队算法
将问题转化为:有 个位置(),每个位置有一个值,询问区间 内相同值的对数。
使用莫队算法:
- 将询问按块排序
- 维护当前区间内每个值的出现次数
- 移动指针时更新答案
算法复杂度分析
特殊情况()
- 预处理:
- 每次查询:
- 总复杂度:
一般情况()
- 预处理:
- 计算幂次:
- 计算后缀值:
- 离散化:
- 莫队算法:
- 总复杂度:
关键技巧总结
- 数学转化:利用后缀表示将子串整除问题转化为值相等问题
- 特殊情况处理: 时性质特殊,单独处理
- 离散化:将大范围的模P值映射到小范围,便于计数
- 莫队算法:高效处理区间内相同值对数的查询
- 边界处理:注意f数组有个值,询问区间要相应调整
正确性证明
对于子串 :
- 其数值 =
- 由于 与 互质,该值为0当且仅当
- 因此统计区间 内相同f值的对数即为答案
这种方法充分利用了数论性质和算法技巧,将复杂的子串统计问题转化为高效的区间查询问题。
- 1
信息
- ID
- 4747
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者