[Hnoi2016 day2]大数
问题描述
小 B 有一个很大的数 S,长度达到了 N 位;这个数可以看成是一个串,它可能有前导 0,例如00009312345。小B还有一个素数P。现在,小 B 提出了 M 个询问,每个询问求 S 的一个子串中有多少子串是 P 的倍数(0 也是P 的倍数)。
例如 S为0077时,其子串 007有6个子串:0,0,7,00,07,007;显然0077的子串007有6个子串都是素
数7的倍数。
输入格式
第一行一个整数:P。
第二行一个串:S。
第三行一个整数:M。
接下来M行,每行两个整数 fr,to,表示对S 的子串S[fr…to]的一次询问。
注意:S的最左端的数字的位置序号为 1;例如S为213567,则S[1]为 2,S[1…3]为 213。N,M<=100000,P为素数
输出格式
输出M行,每行一个整数,第 i行是第 i个询问的答案。
样例输入
11
121121
3
1 6
1 5
1 4
样例输出
5
3
2
提示
对于30%的数据: n,m<=1000
对于60%的数据: n<=10000,m<=1000
对于100%的数据:n,m<=100000,p是素数
判断一个字串是否能被P整除,容易想到求出该串的后缀模P的值,然后当$P\neq2\&\&P\neq5$时,子串$[L,R]$能被P整除当且仅当后缀$L$和$R+1$模P的值相等。因此可以离散化后用莫队维护模P的cnt值。然后组合数求方案即可。
当P等于2或5时需要特判。
代码:
1 |
|