Krydom: 暁の水平线に胜利を刻むのです

ソロモンの悪夢、見せてあげる!

@krydom2年前

05/12
10:07
莫队算法

[bzoj 4542] Hnoi2016 大数

♦♦♦♦♦♦   Description   ♦♦♦♦♦♦

 小 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的倍数。

♦♦♦♦♦♦   Input   ♦♦♦♦♦♦

第一行一个整数: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为素数

♦♦♦♦♦♦   Output   ♦♦♦♦♦♦

输出M行,每行一个整数,第 i行是第 i个询问的答案。

♦♦♦♦♦♦   Sample Input   ♦♦♦♦♦♦

11
121121
3
1 6
1 5
1 4

♦♦♦♦♦♦   Sample Output   ♦♦♦♦♦♦

5
3
2
//第一个询问问的是整个串,满足条件的子串分别有:121121,2112,11,121,121。

♦♦♦♦♦♦   Hint   ♦♦♦♦♦♦

♦♦♦♦♦♦   题解  ♦♦♦♦♦♦

当P!=2或5时,显然10^x%P!=0

把后缀模P的值搞出来,于是问题就便成询问区间内%P为x的分别有多少个

这个再套一个莫队就可以了。

当P=2、5时特判一下就行了

c++:

pascal:

 

[bzoj 4542] Hnoi2016 大数