前言
这已经不是普通的 \(\rm{dp}\) 了, 必须要出重拳!
思路
首先这种问题你至少要先模拟
你发现对于 \(i\) 位置, 序列 \([i, n]\) 的前缀最小值都会交换一遍, 把这些位置记为 \(p_0, p_1, p_2, \cdots p_{c_i}\) , 你发现交换之后位置会向右循环移位
那么怎样的排列可以满足 \(c\) 序列的要求?
考虑打个表看下同 \(c\) 序列有什么性质
例如
6
0 1 1 1 01 3 4 5 2 6
1 3 5 2 4 6
1 4 2 5 3 6
1 5 2 3 4 6
容易发现的是对于序列 \([i, n]\) , 后面存在的值也一定只有 \([i, n]\) 了, 而且还要有 \(c_i + 1\) 个前缀最小值?
你发现对于原序列的 \(c_0 + 1\) 个前缀最小值, 在后面只会 \(\pm 1\) , 为什么呢
每次对于一个位置 \(i\) , 假设其值为 \(k\) , 那么后面会有 \(k - i + 1\) 个数比他小, 但是其中只有 \(c_i + 1\) 个数是降序的, 然后这个位置对后面的影响就是这些数整体右移, 然后下一位还需要有 \(c_{i + 1} + 1\) 个数是降序的, 你发现原先的 \(c_i + 1\) 个数, 会有 \(c_i\) 个往下继续延伸, 然后你可以从之前的新增一些达到后面的要求
但是从前往后算, 不好讨论新增的可能性
正难则反, 你发现每次删除的可能性都是 \(c_{i + 1} + 1 \choose c_i\) , 每次乘上即可
总结
组合数学神秘题目, 没太搞懂, 以后继续