题意简述
给你一个数字字符串 S S S,长度为 n < = 1 e 5 n<=1e5 n<=1e5。有一个 i n t int int范围内的质数 P P P和 Q < = 1 e 5 Q<=1e5 Q<=1e5次询问,每次询问一个区间 [ l , r ] [l,r] [l,r]中, S S S的多少个子串(不一定不同)是 P P P的倍数。
比如 S = " 007 " S="007" S="007",它有6个子串,分别是 { 0 , 0 , 00 , 07 , 007 } \{0,0,00,07,007\} { 0,0,00,07,007},这 6 6 6个都是 7 7 7的倍数。
思路框架
处理后缀和,分类讨论 p p p和 10 10 10是否互质。一个用莫队维护,一个用树状数组维护。
具体思路
先分类讨论。
1. P和10互质
那么末尾多几个 0 0 0就不会影响对 P P P的整除性。
维护后缀和 s u f suf suf,它表示从 i i i开始的后缀接起来膜 P P P的值。特殊地, s u f [ n + 1 ] = 0 suf[n+1]=0 suf[n+1]=0。对于一个区间 [ l , r ] [l,r] [l,r],当 s u f [ l ] suf[l] suf[l]和 s u f [ r + 1 ] suf[r+1] suf[r+1]相等的时候, [ l , r ] [l,r] [l,