这题就是让你求一个长度为
k 的排列的错排数。
翻了一下题解和网络,发现只有我一个傻逼试图用容斥推导错排公式。
结果推出来的式子和题解都不一样(噗)
那就做一次傻逼吧。设一下错排数列,推导的思路就是容斥的基本思路:
设f(n)表示长度为n的错排
直接按照思路写下公式
f(n)=∑i=0n(−1)i(ni)(n−i)!
看见后面是
(n−i)! ,回想一下组合数公式就会发现我们可以把组合数拆了:
=∑i=0n(−1)ii!n!
提出来
=n!(∑i=0n(−1)ii!1)
尝试递推,我们列出
f(n−1) 的式子看看要加几项才可以变成
f(n)
f(n−1)=(n−1)!(∑i=0n−1(−1)ii!1)
把
(n−1)! 乘个
n 变成
n! 之后,
括号里面只缺多出来的
(−1)nn!1 这一项,把括号拆了, 乘进去发现是
n×f(n−1)=∑i=0n−1(−1)ii!n!
那么补上剩下的
(−1)nn!n! 就可以得到
f(n)=n×f(n−1)+(−1)n
然后这么递推是
O(n) 的。
我还生成了一个图