#593. 新年的军队
属实是一道神仙题,估计是去年这个时候听说了这道题,最近把这个坑填了。
给后面要来写的人提个醒,这个题其实没有想象地那么恐怖,代码其实也不复杂,只是推导十分困难。
我说我这篇是全网最详细的不过分吧。
暴力
首先我们熟悉一下题目,本质上就是考虑所有的排列 p p p,一个合法的排列有 m m m 个 p i > p i + 1 p_i > p_{i + 1} pi>pi+1,求 ∀ l , p k = l \forall l, p_k = l ∀l,pk=l 的排列 p p p 的方案数。
暴力直接全排列即可。
转化
显然是人都会全排列,我们考虑点别的。可以发现这个 恰好 m 个下降
就是欧拉数。
我们现在的困难就是如何对应每个 p k = l p_k = l pk=l,并且求出方案数。
考虑使用科技解决这个问题,我们先简化一下如果只需要求一个固定的 l l l。
Q 1 : Q1: Q1: 看到很大的数据范围说明很难使用 D p \tt Dp Dp 来解决问题,况且欧拉数 D p \tt Dp Dp 是 O ( n 2 ) O(n^2) O(n2) 的,已经难以推广。
考虑一个经典转化,单点方案数其实可以等价于概率乘上总方案,我们已知总方案我们不妨来计算概率。
Q 2 : Q2: Q2: 很显然如果直接考虑所有排列的话我们不一定满足条件,我们不妨只考虑选取的数之后通过别的方式来计算出合法的排列个数。
显然这个合法的排列个数就是答案。这就意味着反演。
考虑使用概率密度函数:
我们考虑一个点在 4 × 1 4 4 \times \frac{1}{4} 4×41 的长方形内区间 [ 1 , 2 ] [1, 2] [1,2] 的分布概率,就是函数在 [ 1 , 2 ] [1, 2] [1,2] 区间的积分。
这个 1 4 \frac{1}{4} 41 其实就是个类似概率密度函数的东西。它用来描述连续型随机变量的输出值。我们想要知道它落在某个区间上的概率,只需要在这个区间上对概率密度函数作积分即可。
这样转化的好处在于我们可以很轻松地添加一个数。
Q 3 : Q3: Q3: 我们选择数的方案数事实上是会被之前选择的某些数限制了,我们将其放到实数上这样可以解除这样的限制。
有 n n n 个数,每个数的取值是实数 [ 0 , 1 ] [0, 1] [0,1],满足有 m m m 个下降。
建立模型来表示值 x x x 落在某个区间的概率。
设特定位置为 k k k 的总方案数是 α k \alpha_k αk 我们可以得出转化关系。
这样考虑位置 j j j 对概率密度函数的贡献就是 α j ( j − 1 ) ! ( n − j ) ! × x j − 1 ( 1 − x ) n − j \dfrac{\alpha_j }{(j - 1)!(n - j)!}\times x^{j - 1}(1 - x)^{n- j} (j−1)!(n−j)!αj×xj−1(1−x)n−j。
考虑任何一个合法的排列,我们将其分成 < x < x <x 和 > x > x >x 两部分,因为没有数相同所以 < x < x <x 占据的位置是 ( j − 1 ) ! (j - 1)! (j−1)! 排列中的一种, > x > x >x 同理。
∑ j = 0 n − 1 α j x j ( 1 − x ) n − 1 − j j ! ( n − 1 − j ) ! = ∑ j = 0 n − 1 f j x j = f ( x ) \sum_{j = 0} ^ {n - 1} \alpha_j\frac{x^j(1 - x)^{n - 1 - j}}{j!(n - 1 - j)!} = \sum_{j = 0} ^ {n - 1} f_jx^j = f(x) j=0∑n−1αjj!(n−1−j)!xj(1−x)n−1−j=j=0∑n−1fjxj=f(x)
后面的部分表示的仅仅是上述的生成函数,考虑如果已知生成函数如何求出 α \alpha α。
考虑进行换元,我们不需要关注左边的常数,提出来 x n − 1 x^{n - 1} xn−1 可以得到 ( x 1 − x ) j (\frac{x}{1 - x})^j (1−xx)j 换元为 y j y^j yj。
之后考虑有 x 1 − x = y \frac{x}{1 - x} = y 1−xx=y 那么有 x = y 1 + y x = \frac{y}{1 + y} x=1+yy 带入右边得到 ( y 1 + y ) j (\frac{y}{1 + y})^j (1+yy)j 之后将左边的 ( 1 − x ) n − 1 (1 - x)^{n - 1} (1−x)n−1 放到右边可以得到 ( 1 1 + y ) 1 − n (\frac{1}{1 + y})^{1 - n} (1+y1)1−n。
我们重新写一下这个式子:
∑ j = 0 n − 1 α j y j j ! ( n − 1 − j ) ! = ∑ j = 0 n − 1 f j y j ( 1 + y ) n − 1 − j \sum_{j = 0}^{n - 1}\alpha_j \frac{y^j}{j!(n - 1 - j)!} = \sum_{j = 0} ^{n - 1} f_j y^j (1 + y)^{n - 1 - j} j=0∑n−1αjj!(n−1−j)!yj=j=0∑n−1fjyj(1+y)n−1−j
之后将 y y y 看成 x x x 即可。
右边的形式不是很好,不好卷积,考虑展开一下:
∑ j = 0 n − 1 f j x j ( 1 + x ) n − 1 − j = ∑ j = 0 j f j x j ∑ k = 0 n − j − 1 ( n − j − 1 k ) x k = ∑ j = 0 j f j x j ∑ k = 0 n − j − 1 ( n − j − 1 ) ! k ! ( n − j − k − 1 ) ! x k = ∑ j = 0 j f j ( n − j − 1 ) ! x j ∑ k = 0 n − j − 1 1 k ! ( n − j − k − 1 ) ! x k = ∑ j = 0 j x j × 1 ( n − j − 1 ) ! ∑ a + b = j f a ( n − a − 1 ) ! × 1 b ! \begin{aligned} \sum_{j = 0} ^ {n - 1} f_j x^j(1 + x) ^{n - 1 - j} &= \sum_{j = 0} ^ j f_j x^j \sum_{k = 0} ^ {n - j - 1} \binom{n - j - 1}{k} x^k \\\\ &= \sum_{j = 0} ^ j f_j x^j \sum_{k = 0} ^ {n - j - 1} \frac{(n - j - 1)!}{k!(n - j - k - 1)!} x^k \\\\ &= \sum_{j = 0} ^ j f_j (n - j - 1)! x^j \sum_{k = 0} ^ {n - j - 1} \frac{1}{k!(n - j - k - 1)!} x^k \\\\ &= \sum_{j = 0} ^ j x^j \times \frac{1}{(n - j - 1)!}\sum_{a + b = j} f_a(n - a -1)! \times \frac{1}{b!} \end{aligned} j=0∑n−1fjxj(1+x)n−1−j=j=0∑jfjxjk=0∑n−j−1(kn−j−1)xk=j=0∑jfjxjk=0∑n−j−1k!(n−j−k−1)!(n−j−1)!xk=