组合数学(1)----错位排列

组合数学(1)----错位排列

整理自Richard A.Brualdi的《组合数学》

1.定义

如果定义全排列 1~n,
那么 一个排列满足 任意的i都满足a[i]!=i,称之为错位排列。
定义集合元素个数为n的错位排列个数为Dn
比如这些问题:
一个聚会上,10位绅士查看他们的帽子。有多少种方式使得这些绅士中没有人能够拿到他们最开始的帽子?
把一个单词打乱,多少种可能新单词和旧单词每一位都不一样?
诸如此类。

2.递推公式

错位排列有两种递推公式
第一: Dn=(n1)(Dn1+Dn2)
第二: Dn=nDn1+(1)n

其中1,2式子均满足D1=0,D2=1

下面给出《组合数学》中的证明:
假设n>=3,考虑{1,2...,n}Dn个错位排列
来看看第一个位置的情况:
它可以是除1以外的任何数字,那么一共有n1种情况并且每一种情况所产生的排列数都应该相同,我们设为dn
也就是说 Dn=(n1)dn
现在来看看dn:
因为第1个位置可以是除1以外的任何数,并且产生排列数相同。
出于方便,我们假设第1个位置的数是2:
确定了第一个位置之后我们发现只需要讨论第二个位置是不是1这是一个特殊的点。

如果第2个位置是1,那接下来的n2个位置等价于n个元素中有两个元素调换了位置。
那我们可以把他们踢出去,他们已经不影响问题了。
而剩下的元素将继续进行错位排列,也就是 Dn2

如果第2个位置不是1,这时候来重新陈述一下问题:
第2个位置不能是1,第3个位置不能是3,第4个位置不能是4.....第n个位置不能是n
这个问题是不是似曾相识?
是的,又是一个错排,这个错排只少了一个位置,所以他是Dn1

得到:dn=Dn1+Dn2
联立之前的式子就是Dn=(n1)(Dn1+Dn2)
再将这个式子不断地递归求解就会得出Dn=nDn1+(1)n

3.通项公式

先直接给出结论(uysy这个也没啥用,时间复杂度也是O(n)的)
Dn=n!(111!+12!13!+...(1)n1n!)
这个问题需要用到容斥定理的一个结论。
之后在容斥定理的总结中给出(莫比乌斯反演真的看不懂啊* ^ *)

posted @   Paranoid5  阅读(6273)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示