问题描述 Description
我们知道,哈希(hash)算法被广泛应用于字符串处理领域之中。现有如下哈希函数: f ( s , l , r ) = ∏ i = l r o r d ( s i ) m o d p f(s,l,r)=\prod_{i=l}^r ord(s_i) \bmod p f(s,l,r)=i=l∏rord(si)modp 公式中, o r d ord ord代表的是字符的ascii码, m o d \bmod mod代表的是求余操作, ∏ \prod ∏则是求积操作,意为求 l l l到 r r r之间所有字符的积。
现在给定一个长度为 N N N的字符串,并给出 p p p,之后会有若干组询问,每次询问这个字符串相对于那个区间的子串的哈希值。
输入 Input
输入文件包括若干行,其中第一行是一个字符串 ,数据保证其中只会出现小写英文字母。
第二行是一个整数 p p p。
第三行是一个整数 m m m,表示询问的次数。
接下来的 m m m行,每行有两个整数 l , r ( 1 ≤ l ≤ r ≤ n ) l,r(1≤l≤r≤n) l,r(1≤l≤r≤n),表示询问从第 l l l位到第 r r r位的哈希值。
输出 Output
输出文件包括 m m m行,依次给出输入文件中相应的询问对应的答案.
样例输入 Sample Input
efqzvcowdormnslhjzznubn
56
4
17 18
7 20
14 16
15 23
样例输出 Sample Output
52
0
40
0
限制 Limits
对于 30 % 30\% 30%的数据, 1 ≤ N ≤ 100 , 1 ≤ m ≤ 10 1≤N≤100 ,1≤m≤10 1≤N≤100,1≤m≤10;
对于 70 % 70\% 70%的数据, 1 ≤ N ≤ 1 0 5 , 1 ≤ m ≤ 1 0 4 1≤N≤10^5 ,1≤m≤10^4 1≤N≤105,1≤m≤104;
对于 100 % 100\% 100%的数据, 1 ≤ N ≤ 1 0 5 , 1 ≤ m ≤ 1 0 5 1≤N≤10^5 ,1≤m≤10^5 1≤N≤105,1≤m≤105。
Time Limit : 1 s 1s 1s & Memory Limit : 128 M B 128MB 128MB
黑历史题,只有查询的线段树……
只有查询?先求前缀积,再求个逆元,搞一搞就好了…
但是并不知道
p
p
p有多大,题中也没说,题解说可以写也是一种优化方法吧。
时间
O
(
n
log
2
n
+
T
log
2
n
)
O(n\log_2n+T\log_2n)
O(nlog2n+Tlog2n)
Code