一道有趣的数列题,然而场上没有做出来。
看完题解发现跟我想的差不多,就是我码风太屎。
里面分类讨论和组合数学的部分感觉出的很不错。
主要是对官方题解的翻译,并加入了我的理解。
题目链接。
题意
现在有一个数列
假设你将这个数列分成了
我们称一种分的方法为平衡的,当且仅当对于每一个
求一共有多少种平衡的分法,对
多组数据。
题解
首先我们来考虑一个暴力的思路。
设
我们暴力枚举最左边和最右边区间的范围,进行转移。
时间复杂度是
虽然这个时间复杂度无法接受,但是这个方法可以优化。
现在我们来看具体求一个区间
,那么显然所有方法都可行,所以答案为 。 ,我们设区间 最左边共有 个连续的 ,最右边一共有 个连续的 。 如果分成的区间中,最左边和最右边
段的和都为 ,那么此时方案数为 其中
表示将左边的 个 分成 段(左边的 段是上一行说的和为 的 段,最后一段给区间 最左边的一段分过去),并且其中 段要求非空的方案数, 同理。 最后整个乘以
表示考虑了最左边和最右边的 段以后,中间切分的方案数。 所以此时最终答案为
。 对于剩下的情况,我们设:
最小的
使得存在一个 满足: 。 一个最大的
使得对于上述的 满足 。 这个
和 可以使用双指针去找。 然后再进行分类讨论:
如果
或 ,说明这个序列不存在分成 段的方案,所以此时答案为 。 并且可以注意到,对于所有剩余的情况,肯定会有
,并且 。 。 可以知道,此时当且仅当
中所有元素在同一段里, 中所有元素在同一段里,这个切分方案就是合法的。 所以此时答案为
。 对于剩下的所有情况,我们设区间
中最左边共有 个连续的 ,最右边共有 个连续的 。 当且仅当满足这三个条件是,一个切分方案是合法的:
- 区间
在同一段, 在同一段。 - 区间
中和为 的段数=区间 中和为 的段数。 - 区间
的切分方案合法。
所以我们还是枚举区间
中共有 段和为 。 这时方案数为
。 其中
表示将左边这些 分为 段(中间的 段是上面说的和为 的 段,最左边的一段给 ,最右边的一段给 ),并且中间 段非空的方案数。 同理。 所以此时的方案数为
。 之所以有一个
,是因为存在方案,使得 全部属于 的最左边的一段, 全部属于 的最右边的一段。 - 区间
直接递归就可以了,细节不算多,但是也不算特别少。
时间复杂度
需要预处理阶乘及其逆元,也可以做到
代码
我懒了亿点,预处理写的是
1 |
|
感谢观看!