更新历史
洛谷传送门
题意
给定常数 k。对于一个长度为 n 的排列 a,定义序列 f(a)={max1≤i≤k{ai},max2≤i≤k+1{ai},…,maxn−k+1≤i≤n{ai}}。
求出对于所有长度为 n 的排列 p,f(p) 中不同的数的个数之和。
思路
显然 f 数组是由若干个互不相同的连续段构成的,于是我们只需要对连续段进行计数即可。
因为连续段的数量等于「相邻两个数不同的对数」再加 1,所以对于每一个 i,考虑 f(p)i=f(p)i+1 的排列 p 的数量。
注意到 f(p)i 和 f(p)i+1 是两个相邻的长度为 k 的区间的最大值,那么他们不相同等价于:这两个区间的并(一个长度为 k+1 的区间)的最大值位于这个大区间的头或尾。而在一共 n! 个排列中,这个长度为 k+1 的区间的最大值位于区间首尾的概率为 k+12,故共有 n!×k+12 个排列满足:对于某个固定的 i,有 f(p)i=f(p)i+1。
这个式子与 i 无关,所以直接将其乘上 i 的数量(即 n−k)即为答案。
故答案为 n!×k+12×(n−k)+n!(最后加的 n! 是因为每个排列有额外的 1 的贡献)。