主题

主题

 
   

4542: [Hnoi2016]大数

原题:http://www.lydsy.com/JudgeOnline/problem.php?id=4542

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 

1 6

1 5

1 4

Sample Output

5

3

2

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


个人解法:

又是一道子串的子串问题。于是我们考虑莫队。

先转换条件:

我们把所有数字转换为modp意义下。

设S[i]=sigma(j=0;j<=n-i+1)10^j*A[n-j],那么A[l..r]%p=0,意味着(S[l]-S[r+1])/10^(r-l)=0。

于是,查询[l..r],变为了

查询{(i,j),l<=i<=j<=r|S[i]=S[j+1]}的个数。

或者换一句话来说,查询[l..r]的答案,就是查询[l..r+1]内有多少个相同的数字。

于是维护桶,莫队就可以了。

话说才意识到O(nsqrt(n))=O(nlog^2n)……跑得也不是那么地慢啊……

注意2与5特判,不能搞在这种方法里面。搞2和5的方法,我用的是一个后缀和的思想。其实自己YY就好了。


代码如下:

https://code.csdn.net/snippets/2147251


我对HNOI的记忆似乎总是停留在2016的省选中,一个题都不会做完全弃疗最后只有20分的蒟蒻。曾经总感觉HNOI是不可接近的,比本蒟高到不知道哪里去了。

事实上也是……

不过好在走到了现在,重新接触当初这几道题,不觉得是想象中地那么难。毕竟又是一年了吧。

今天腊月廿五。

 
 
评论