传送门
题意:
现在有一个人分别从\(1,n\)两点出发,包中有一个物品价值一开始为\(0\),每遇到一个价值比包中物品高的就交换两个物品。
现在已知这个人从左边出发交换了\(a\)次,从右边出发交换了\(b\)次。
现在问有多少个排列满足这一条件。
思路:
- 倒过来考虑的话,显然全局最大值为最后一次交换。
- 然后左边我们会放置\(a-1\)个递增的物品,右边放\(b-1\)个递减的物品,其余的物品我们在中间部分任意放置即可,但要保证价值在一定范围。
- 将问题进一步抽象,我们即要将\(n-1\)个数划分为\(a+b-2\)个排列,因为每个排列都有一个最大值,所以一定存在一种合法放案使得每个排列中只会交换一次。
- 因为最后还有两个部分,所以还要乘以一个组合数,那么答案就是\(\displaystyle \begin{bmatrix} n - 1 \\ a - b + 2 \end{bmatrix}\cdot {a-b+2\choose a-1}\) 。
- 那么问题就是如何快速处理一行的第一类斯特林数了。主要是通过生成函数来求解,详细内容可以见:传送门
正难则反,正过来考虑较为复杂的情况,倒过来就显得清晰很多。
代码如下:
/*
* Author: heyuhhh
* Created Time: 2019/12/15 10:30:30
*/
#include
#include
#include
#include
#include
#include
#include