定义:∀i∈[1,n],pi≠i 的长度为 n 的排列数。
一开始看到的时候还想用容斥推:n∑i=0(ni)(−1)i(n−i)!,结果发现太垃圾了。
递推法
设 D(n) 表示长度为 n 的错排数,考虑枚举数 n 放在了第 i 个位置(1≤i≤n−1),然后此时数 i 已经不在自己的位置了,考虑它放在哪:
- 若数 i 放在了第 n 个位置,那么相当于剩下的 n−2 个数的错排问题。
- 若数 i 不放在第 n 个位置,此时看成数 i 也有一个错排限制,于是相当于 n−1 个数的错排问题。
于是有递推式:D(n)=(n−1)(D(n−1)+D(n−2))。
生成函数法
排列可以看成若干个置换环组成,错排可以看成若干个大小不为 1 的置换环组成。
可知大小为 n 的置换环的数量为 (n−1)!,那么大小为 n(n≥2) 的置换环数量的 EGF 为:
F(x)=∑n≥2(n−1)!n!xn=∑n≥2xnn=(∫∑n≥0xn)−x=(∫11−x)−x=−ln(1−x)−x
于是错排数的指数生成函数即为:
expF(x)=exp(−ln(1−x)−x)
递推式变换法
算是递推法的进阶。回顾得到的递推式
d0=1,d1=0dn=(n−1)(dn−1+dn−2)
做一些变换
dn=ndn−1+(n−1)dn−2−dn−1dn−ndn−1=−(dn−1−(n−1)dn−2)
记 en=dn−ndn−1,初项 e1=−1,且
en=−en−1=(−1)n
那么
dn=ndn−1+(−1)ndnn!=dn−1(n−1)!+(−1)nn!
记 fn=dn/n!,初项 f0=1,于是
fn=fn−1+(−1)nn!=n∑i=0(−1)ii!
那么错排数的指数生成函数为
e−x1−x
这和第二种方法推出来是一样的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现