题目描述
sol 研发了一个神奇的随机数系统,可以自动按照环境噪音生成真·随机数。
现在 sol 打算生成 个 的整数 ,然后进行一些询问。
次询问,每次询问 有两个参数 和 ,sol 会计算 ( 数组中下标在 之间的数的最小值)。
最后测试结果会是这些询问得到的结果的最大值。
sol 进行了很多次实验,现在他想问问你测试结果的期望大小是多少,对 取模。
输入格式
第一行三个数 。
下面 行,第 行两个数表示 和 。
输出格式
一行一个数,表示答案。
输入输出样例 #1
输入 #1
输出 #1
输入输出样例 #2
输入 #2
1 2 3 4 5 6 7
| 6 6 6 1 3 2 4 3 5 4 6 5 6 3 4
|
输出 #2
说明/提示
提示:一个分数 对 取模的结果为 。
对于 的数据,。
对于另外 的数据,。
对于 的数据,。
对于 的数据,。
对于 的数据,,对于每个 ,。
题解
问题转化
可以考虑对于每个 ,求出最后的最大值为 的概率 ,然后答案就是:。
众所周知,“最大值恰好为 ”往往是不好处理的。
所以考虑差分:设 表示最后的最大值 的概率,这样答案就是:,于是问题转化为求 。
发现这个 其实是一个计数问题(因为方案数除以 就是概率),于是问题转化为“求所有区间的最小值的最大值 的方案数”。
区间预处理
- 如果一个大区间包含了其他的小区间,那么这个大区间对最后的最大值是没有影响的,可以删掉;
- 对于剩下的没有包含关系的区间,按照左端点排序,那么右端点是严格单调递增的。
计数 DP
设 表示最后的最大值 的方案数。等价于每个区间的最小值都 ,也即每个区间内都存在一个 的数。
枚举 表示有多少个数 ,那么
其中 表示在 内选出 个点,使得每个区间至少包含一个点的方案数。
下面我们开始求 。
定义状态: 表示前 个位置放了 个点且第 个位置必须放点,保证所有左端点 的区间至少有一个点的方案数。
预处理 和 表示覆盖位置 的最左区间编号和最右区间编号。特殊地,如果 不被任何区间包含,则 为右端点严格小于 的最后一个区间,。
转移:
发现可以参与转移的 是一个连续的区间。使用前缀和优化可以降低复杂度至 。
于是 就很容易算出:
总复杂度 。