错排问题 + 组合数
题目描述
求有多少种长度为 n 的序列 A,满足以下条件:
1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对$10^9+7$取模
Inputs and Outputs examples
Inputs’ e.g. #1
1 | 5 |
Outputs’ e.g. #1
1 | 0 |
分析
比较巧妙的一道题,较完美的结合了组合数和错排问题qwq
首先我们要知道一个经典小学奥数模型,错排问题.
错排问题的模型是这个样子的:有n封信,每封信都装错了,求装错的方法有多少种。
设$d_i$为有$i$封信装错的方案数,显然$d_1 = 0,d_2 = 1$.
当$n \geq 3$,我们钦定一个位置$k$,让第$n$位的数来这里,此时会有两种情况:
- 第$k$位的数与第$n$位的数交换,也就是$k$位于第$n$位,此时的错排相当于$d_{n-2}$
- $k$不位于第$n$位,此时的错排相当于$d_{n-1}$
由于$1 \leq k < n$,那么$k$的取值方法有$n-1$种,那么我们就可以得到一个递推式:
$$d_n = (n-1)(d_{n-1} + d_{n-2})$$
然后我们再结合题目,它要求有$m$个数必须满足$A_i = i$,也就是说会有$n-m$个数错排,所以答案显然就是:
$${\rm Ans} = C_n^m \times D_{n-m}$$
代码
1 | // luogu-judger-enable-o2 |