AT_k2pc001_h5 暗号化(Encipherment)
题目描述
kagamiz 正在学习哈希。
kagamiz 在《算法竞赛进阶指南》中学习了滚动哈希,并了解到哈希是一种在字符串查找中非常有效的方法。
于是,kagamiz 思考是否可以对任意多重集合进行哈希,并设计了如下的哈希函数。
「
设 $P$ 为素数。要进行哈希的序列为 $ {x_1,x_2,x_3,...,x_n} $,对于每个 $x_i$,令 $C_i$ 表示满足 $j \leq i$ 且 $x_j = x_i$ 的 $j$ 的个数,
则(哈希值)$ = \sum x_i^{C_i} \bmod P $
」
虽然这个哈希函数很容易产生冲突,但无论如何,kagamiz 还是让你用这个函数来解决下面的问题。
**问题**:给定一个长度为 $N$ 的数列 $ {a_1,a_2,a_3,...,a_N} $,对于其中的 $Q$ 个子区间,分别求出上述哈希值。
> $N$ $Q$ $P$ $a_1$ $a_2$ $...$ $a_N$ $s_1\ t_1$ $s_2\ t_2$ ... $s_Q\ t_Q$
首先给出数列长度 $N$,需要求哈希值的连续子区间个数 $Q$,素数 $P$。
接下来给出长度为 $N$ 的数列 $ {a_1,a_2,...,a_N} $。
最后给出 $Q$ 个子区间的端点 $[s_i, t_i]$。对于每个子区间,按照题目中的哈希函数,输出其哈希值,每个结果占一行。
- $1 \leq N \leq 10^5$ 数列长度
- $1 \leq Q \leq 10^5$ 子区间个数
- $1 \leq P \leq 10^9$ 哈希函数使用的素数
- $1 \leq a_i \leq 10^6$ 数列中的每个元素
- $1 \leq s_i \leq t_i \leq N$ 每个子区间的端点
对于 $20\%$ 的数据,保证 $i \neq j$ 时 $a_i \neq a_j$。
```
10 10 8999
2 1 1 2 1 2 1 2 1 2
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
```
```
2
3
4
8
9
17
18
34
35
67
```
```
6 6 2
1 2 3 4 5 6
1 2
2 3
3 4
4 4
5 5
6 6
```
```
1
1
1
0
1
0
```
输入格式
第一行包含三个整数 $N$、$Q$、$P$,分别表示数列长度、子区间个数和哈希函数使用的素数。
第二行包含 $N$ 个整数 $a_1,a_2,...,a_N$,表示数列。
接下来 $Q$ 行,每行包含两个整数 $s_i$、$t_i$,表示一个子区间的起止位置。
输出格式
对于每个子区间,输出一行哈希值。
说明/提示
无。
由 ChatGPT 4.1 翻译