#47. 教我KMP
教我KMP
教我KMP
题目描述
小 R 老师最近在给同学们讲 KMP。
但是讲着讲着,小 R 老师突然发现:自己好像也不是很会 KMP。
小 R 老师坚信,机房里的同学们都是字符串大师。哪怕原串已经灰飞烟灭,只剩下一串神秘的 KMP 前缀函数,同学们也一定能把可能的原串数量全部数出来。
为了掩盖自己不会 KMP 这件事,小 R 老师拿出了一台神秘的字符串机器。对于任意一个字符串 ,这台机器都可以输出它的 KMP 前缀函数。
对于一个长度为 的字符串 ,定义 表示 的前缀 的最长真 border 长度。也就是说, 是最大的整数 ,满足:
且
特别地,若不存在非空真 border,则 。
现在,小 R 老师不小心把原来的字符串 弄丢了,只留下了这台机器输出的 。
给定一个字符集大小 ,也就是说每个字符都可以从 种不同字符中选择。小 R 老师想知道:有多少个长度为 的字符串 ,能够让这台机器输出恰好为给定的 KMP 前缀函数序列?
由于答案可能很大,请输出答案对 取模后的结果。
题目保证给定的 KMP 前缀函数序列至少对应一个合法字符串。
输入格式
第一行包含两个整数 ,分别表示字符串长度和字符集大小。
第二行包含 个整数 ,表示给定的 KMP 前缀函数。
输出格式
输出一个整数,表示满足条件的字符串数量对 取模后的结果。
样例 1 输入
3 3
0 0
样例 1 输出
12
样例 1 解释
设字符串为 。
由于 ,所以必须有:
由于 ,所以必须有:
因此, 有 种选择, 有 种选择, 有 种选择。
所以答案为:
样例 2 输入
5 1000000000
1 2 3 4
样例 2 输出
1000000000
样例 2 解释
给定的前缀函数表示:
因此每个位置都必须与前一个位置保持连续匹配,整个字符串只能由同一种字符组成。
第一个字符有 种选择,所以答案为 。
样例 3
见选手目录下的 kmp/kmp3.in 与 kmp/kmp3.ans。
该样例满足测试点 的约束条件。
样例 4
见选手目录下的 kmp/kmp4.in 与 kmp/kmp4.ans。
该样例满足测试点 的约束条件。
样例 5
见选手目录下的 kmp/kmp5.in 与 kmp/kmp5.ans。
该样例满足测试点 的约束条件。
样例 6
见选手目录下的 kmp/kmp6.in 与 kmp/kmp6.ans。
该样例满足测试点 的约束条件。
样例 7
见选手目录下的 kmp/kmp7.in 与 kmp/kmp7.ans。
该样例满足测试点 的约束条件。
样例 8
见选手目录下的 kmp/kmp8.in 与 kmp/kmp8.ans。
该样例满足测试点 的约束条件。
样例 9
见选手目录下的 kmp/kmp9.in 与 kmp/kmp9.ans。
该样例满足测试点 的约束条件。
数据范围
对于所有测试数据,均满足:
- ;
- ;
- 对于所有 ,有 ;
- 题目保证给定的 至少对应一个合法字符串。
本题共 个测试点,每个测试点 分。
| 测试点编号 | 分值 | 约束条件 |
|---|---|---|
| 对所有 ,均有 | ||
| 对所有 ,均有 | ||
| 无额外限制 |