错排
定义错排d(x)为:长度为x的排列,并且对于任意i,第i位的数不是i的排列方案数。
求法1:无脑容斥。
至少有k个位置对应的数与下标相同的方案数为 \(\binom{n}{k} (n-k)!\)
d(x)相当于k=0的情况减k=1加上k=2...来容斥的结果。形式化表达为:
\[d(n) = \sum_{k=0}^n(-1)^k\binom{n}{k} (n-k)!\\
=n!\sum(-1)^k\frac{1}{k!} (用定义展开组合数,将n!移出来)
\]
求法2:递推
另一种做法是考虑递推,考虑 $ n $ 所在的环的大小:
- 大小为 2,那么剩下的所有是一个 $ n-2 $ 的错排,方案数为 $ (n-1) d_{n-2} $
- 大小 $ > 2 $,那么插入 $ n $ 之前就已经是一个错排了,枚举插入位置,方案数为 $ (n-1) d_{n-1} $
\[\therefore d_n = (n-1)(d_{n-1} + d_{n-2})
\]
初值:\(d_1 = 0, d_2 = 1\)
例题
[SDOI2016] 排列计数
求有多少种 1 ∼ n 的排列 a,满足恰有 m 个位置 i 使得 \(a_i = i\)。答案对 1e9 + 7 取模。
1 ≤ T ≤ 5 × 1e5,1 ≤ n ≤ 1e6,0 ≤ m ≤ 1e6。
从n中任意钦定m个位置:\(\binom{n}{m}\)
这m个位置的数顺序随意:\(m!\)
剩下位置错排:\(d_{n-m}\)
所以答案为\(\binom{n}{m}m!d_{n-m}\)
预处理阶乘逆元后O(1)求