题意简述
给你一个数字字符串$S$,长度为$n<=1e5$。有一个$int$范围内的质数$P$和$Q<=1e5$次询问,每次询问一个区间$[l,r]$中,$S$的多少个子串(不一定不同)是$P$的倍数。
比如$S=”007”$,它有6个子串,分别是$\{0,0,00,07,007\}$,这$6$个都是$7$的倍数。
思路框架
处理后缀和,分类讨论$p$和$10$是否互质。一个用莫队维护,一个用树状数组维护。
具体思路
先分类讨论。
1. P和10互质
那么末尾多几个$0$就不会影响对$P$的整除性。
维护后缀和$suf$,它表示从$i$开始的后缀接起来膜$P$的值。特殊地,$suf[n+1]=0$。对于一个区间$[l,r]$,当$suf[l]$和$suf[r+1]$相等的时候,$[l,r]$这一段就是$P$的倍数了。相当于我们要在$suf$数组中维护相等的无序对数,莫队即珂。
2. P不和10互质
即:P=2或5
这个时候我们就只需要判断末尾就好了。对于$2$的情况,那么子串结尾就是$0,2,4,6,8$。对于$5$的情况,子串结尾就是$0,5$。
假设询问$[l,r]$。我们找到一个$k$,如果以$k$为结尾的子串一定满足条件,那么这个$k$对答案的贡献就是$k-(l-1)$。(因为开始位置珂以是$[l,k]$中的任意一个,一共有$k-(l-1)$种情况)
我们先对$2$和$5$的情况分开讨论,然后开$20$个树状数组,其中$10$个维护长度为0~9的下标的和,另外$10$个维护$0~9$中的数量和。
对于$[l,r]$的询问,相当于要求和所有$k-(l-1)$。令满足条件$k$的数量是$C$,和为$S$。那么这一段答案就是$S-(l-1)\times C$。对于每一种尾数累加答案即珂。
代码
1 |
|