目测最近要刷刷关于排列组合的题目。。。

所以现在将遇到的那些熟悉却已经忘记的问题都总结一下。。

第一发: 错排以及错排公式

其实错排问题对于程序算法而言,就是递归问题。因为错排的理解其实就是相当于阶乘似的不断递归。

而且最关键的是很容易理解。不想阶乘那样,一旦超过一个上限,还要用大数来表示。。。。

好吧,废话说完了。具体的错排算法如下:

递推的推导错排公式

当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时 有两种情况⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有M(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法;
综上得到
M(n) = (n-1) * [ M(n-2) + M(n-1) ]
特殊地,M(1) = 0 ; M (2) = 1 ;
下面通过这个递推关系推导通项公式:
为方便起见,设M(k)=k!N(k),(k=1,2,…,n)
则N⑴=0,N⑵=1/2
n>=3时,n!N(n)=(n-1)(n-1)!N(n-1)+(n-1)!N(n-2)
即 nN(n)=(n-1)N(n-1)+N(n-2)
于是有N(n)-N(n-1)=-[N(n-1)-N(n-2)]/n=(-1/n)[-1/(n-1)][-1/(n-2)]…(-1/3)[N⑵-N⑴]=(-1)^n/n!
因此
N(n-1)-N(n-2)=(-1)^(n-1)/(n-1)!
N⑵-N⑴=(-1)^2/2!
相加,可得
N(n)=(-1)^2/2!+…+(-1)^(n-1)/(n-1)!+(-1)^n/n!
因此
M(n)=n![(-1)^2/2!+…+(-1)^(n-1)/(n-1)!+(-1)^n/n!]
可以得到
错排公式为M(n) = n! *(1/2! - 1/3! + ….. + (-1)^n / n! )

容斥原理

正整数1、2、3、……、n的全排列有n!种,其中第k位是k的排列有(n-1)!,当k取1、2、3、……、n时,共有n*(n-1)!种排列,由于是错排,这些排列应排除,但是此时把同时有两个数不错排的排列多排除了一次,应补上;在补上时,把同时有三个数不错排的排列多补上了一次,应排除;……;继续这一过程,得到错排的排列种数为
M(n)=n!-n!/1!+n!/2!-n!/3!+…+(-1)^n*n!/n!=sigma(k=2~n) (-1)^k*n!/k!
即M(n)=n![1/0!-1/1!+1/2!-1/3!+1/4!+..+(-1)^n/n!]
注:sigma表示连加符号,(k=2~n)是连加的范围

简化公式

另外:书上的错排公式为Dn=n!(1/0!-1/1!+1/2!-1/3!-.....+(-1)^n/n!)(注:0!=1,参见 阶乘),此公式算n很大时就很不方便.后来发现它可以用级数知识化简为1个优美的式子 Dn=[n!/e+0.5] (e,即 自然对数的底,[x]为取整函数即x向下取整.)
公式证明较简单.观察一般书上的公式,可以发现e-1的前项与之相同,然后作比较可得/Dn-n!e-1/<1/(n+1)<0.5,于是就得到这个简单而优美的公式(此仅供参考)
参考文献:《百度百科》--错排公式: http://baike.baidu.com/link?url=LdDlJZHDHdqkfILN7YlPcC9AhlkvHPgZf5wbGnbOy3WmFWdL_OiClbJr006hYgsh

排列组合之错排问题总结相关推荐

  1. LeetCode-Python-634. 寻找数组的错位排列(数学 + 错排公式)

    在组合数学中,如果一个排列中所有元素都不在原先的位置上,那么这个排列就被称为错位排列. 给定一个从 1 到 n 升序排列的数组,你可以计算出总共有多少个不同的错位排列吗? 由于答案可能非常大,你只需要 ...

  2. 计算机组装错题整理,数学排列组合部分错题精选.docx

    数学排列组合部分错题精选 数学复习易做易错题选 排列组合易错题正误解析 排列组合问题类型繁多.方法丰富.富于变化,稍不注意,极易出错.本文选择一些在教学中学生常见的错误进行正误解析,以飨读者. 1没有 ...

  3. P4071-[SDOI2016]排列计数【组合计数,错排】

    正题 题目链接:https://www.luogu.com.cn/problem/P4071 题目大意 每次询问n,mn,mn,m.求有多少个nnn的排列使得ai=ia_i=iai​=i的数量恰好为m ...

  4. [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)

    辛勤二更 题目 题解 错排数概念 错排数递推公式及其证明 代码实现 这种题做的时候: 做完后:正常这就是生活,我们要学会习惯 题目 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n ...

  5. bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1259  Solved: 766 [Submit][Sta ...

  6. python 排列组合算法_排 列 组 合 公 式 及 排 列 组 合 算 法

    排列组合--排列公式的推理和组合 [实操追 - 女资 - 源] [企鹅 : 10⒈ б .x.9 526] 加法原理和乘法原理,是排列组合中的二条基本原理,在解决计数问 题中经常运用.掌握这两条原理, ...

  7. bzoj4517 [Sdoi2016]排列计数 组合数+错排

    这个题描述的本身就很离散,所以就相当于选出m个位置,剩下的位置的错排 错排的公式也不是很难推,注意及时利用以前的结果就好了,实在不行根据印象打表找规律 设有n个数  ,n个位置,第一个数一定不能选第一 ...

  8. HDU:4535 吉哥系列故事——礼尚往来(数学:错排)

    吉哥系列故事--礼尚往来 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  9. 关于错排公式的推导与应用

    错排问题,又称更列问题,是组合数学中的问题之一.对于它的研究最早可以追溯到十八世纪,当时他被数学家尼古拉·伯努利和欧拉研究,因此在历史上也被称为伯努利--欧拉的错装信封问题.这个问题有许多具体的版本, ...

最新文章

  1. ssl以及构建私有CA
  2. Python基础 2
  3. ASP.NET Core 介绍和项目解读
  4. docker:Error running DeviceCreate (createSnapDevice) dm_task_run failed
  5. TIS教程01-安装
  6. 历史上最有影响力的10款开源项目
  7. 蓝桥杯第六届省赛JAVA真题----生命之树
  8. 杭电1232(图—并查集)
  9. 微信小程序/js上传图片值腾讯云cos
  10. 这应该是把计算机网络五层模型讲的最好是文章了,看不懂你打我
  11. java strut2通配符_Struts2的通配符
  12. 三菱plc分拣程序_基于三菱PLC控制的物料自动分拣模型
  13. Mac操作系统输入法快捷键设置
  14. diskgenius扩容c盘重启电脑卡住_DiskGenius怎么给C盘扩容?DiskGenius无损调整C盘容量方法 (全文)...
  15. qdu yzm10与大富翁的故事 (01背包+输出路径)
  16. 搭建个人网站---域名+解析+github
  17. logback配置文件---logback.xml详解
  18. OpenCV二值化图像像素操作
  19. 基于深度学习的肺部CT影像识别——采用U-net、3D CNN、cGAN实现肺结节的检测(二)
  20. java阅读安卓_基于安卓Android的图书阅读与推荐系统APP的设计

热门文章

  1. mysql查询distinct_mysql中select distinct的用法
  2. stm8程序无法写入c语言,[转载]STM8 PWM例程
  3. 【车牌识别】模板匹配车牌库识别【含GUI Matlab源码 416期】
  4. 加载R包unloadNamespace时,我该怎么办
  5. List remove的三种正确方法
  6. 如何写一个vscode插件
  7. 移动终端安全 顶级会议_顶级移动应用开发公司
  8. Jmeter阶梯压力测试_导出测试报告
  9. 编写strcpy函数
  10. 中文核心期刊目录(2004年版)