文章目录

  • 一、重复有序拆分
  • 二、不重复有序拆分
    • 1、无序拆分基本模型
    • 2、全排列
  • 三、重复有序拆分方案数证明

参考博客 : 按照顺序看

  • 【组合数学】生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多项式系数相关 )
  • 【组合数学】生成函数 ( 线性性质 | 乘积性质 )
  • 【组合数学】生成函数 ( 移位性质 )
  • 【组合数学】生成函数 ( 求和性质 )
  • 【组合数学】生成函数 ( 换元性质 | 求导性质 | 积分性质 )
  • 【组合数学】生成函数 ( 性质总结 | 重要的生成函数 ) ★
  • 【组合数学】生成函数 ( 生成函数示例 | 给定通项公式求生成函数 | 给定生成函数求通项公式 )
  • 【组合数学】生成函数 ( 生成函数应用场景 | 使用生成函数求解递推方程 )
  • 【组合数学】生成函数 ( 使用生成函数求解多重集 r 组合数 )
  • 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )
  • 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 )
  • 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )
  • 【组合数学】生成函数 ( 正整数拆分 | 无序 | 有序 | 允许重复 | 不允许重复 | 无序不重复拆分 | 无序重复拆分 )
  • 【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
  • 【组合数学】生成函数 ( 正整数拆分 | 正整数拆分基本模型 | 有限制条件的无序拆分 )

一、重复有序拆分


将 正整数 NNN 重复地 , 有序拆分 成 rrr 部分 , 方案数为 C(N−1,r−1)C(N-1, r-1)C(N−1,r−1) ★

( 三、中有该组合数由来证明 )

如果对 正整数 NNN 作 任意重复的有序拆分 , 即可以拆分成 111 个数 , 222 个数 , ⋯\cdots⋯ , NNN 个数 ,

拆分成 111 个数方案个数是 (N−11−1)\dbinom{N-1}{1-1}(1−1N−1​)

拆分成 222 个数方案个数是 (N−12−1)\dbinom{N-1}{2-1}(2−1N−1​)

⋮\vdots⋮

拆分成 NNN 个数方案个数是 (N−1N−1)\dbinom{N-1}{N-1}(N−1N−1​)

上述总的方案个数是 : ∑r=1N=2N−1\sum\limits_{r=1}^{N}=2^{N-1}r=1∑N​=2N−1

( 根据基本组合恒等式计算出来 )

二、不重复有序拆分


先进行 不重复无序拆分 , 再进行 全排列 ;

1、无序拆分基本模型

无序拆分基本模型 :

将 正整数 NNN 无序拆分成正整数 , a1,a2,⋯,ana_1, a_2, \cdots , a_na1​,a2​,⋯,an​ 是拆分后的 nnn 个数 ,

该拆分是无序的 , 上述拆分的 nnn 个数的个数可能是不一样的 ,

假设 a1a_1a1​ 有 x1x_1x1​ 个 , a2a_2a2​ 有 x2x_2x2​ 个 , ⋯\cdots⋯ , ana_nan​ 有 xnx_nxn​ 个 , 那么有如下方程 :

a1x1+a2x2+⋯+anxn=Na_1x_1 + a_2x_2 + \cdots + a_nx_n = Na1​x1​+a2​x2​+⋯+an​xn​=N

这种形式可以使用 不定方程非负整数解个数 的生成函数计算 , 是 带系数 , 带限制条件的情况 , 参考 : 组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )

无序拆分的情况下 , 拆分后的正整数 , 允许重复 和 不允许重复 , 是两类组合问题 ;

如果不允许重复 , 那么这些 xix_ixi​ 的取值 , 只能 取值 0,10, 10,1 ; 相当于 带限制条件 , 带系数 的 不定方程非负整数解 的情况 ;

对应的生成函数是 : G(x)=(1+ya1)(1+ya2)⋯(1+yan)G(x) = (1+ y^{a_1}) (1+ y^{a_2}) \cdots (1+ y^{a_n})G(x)=(1+ya1​)(1+ya2​)⋯(1+yan​) ★ 重点看这里

如果 允许重复 , 那么这些 xix_ixi​ 的取值 , 就是 自然数 ; 相当于 带系数 的 不定方程非负整数解 的情况 ;

对应的生成函数是 : G(x)=(1+ya1+y2a1⋯)(1+ya2+y2a2⋯)⋯(1+yan+y2an⋯)G(x) = (1+ y^{a_1}+ y^{2a_1}\cdots) (1+ y^{a_2} + y^{2a_2}\cdots) \cdots (1+ y^{a_n}+ y^{2a_n}\cdots )G(x)=(1+ya1​+y2a1​⋯)(1+ya2​+y2a2​⋯)⋯(1+yan​+y2an​⋯)

或 G(x)=1(1−ya1)(1−ya2)⋯(1−yan)G(x) =\cfrac{1}{ (1-y^{a_1}) (1-y^{a_2}) \cdots (1-y^{a_n}) }G(x)=(1−ya1​)(1−ya2​)⋯(1−yan​)1​

2、全排列

nnn 的全排列是 n!n!n!

nnn 元集 SSS , 从 SSS 集合中选取 rrr 个元素 ;

根据 元素是否允许重复 , 选取过程是否有序 , 将选取问题分为四个子类型 :

元素不重复 元素可以重复
有序选取 集合排列 P(n,r)P(n,r)P(n,r) 多重集排列
无序选取 集合组合 C(n,r)C(n,r)C(n,r) 多重集组合

选取问题中 :

  • 不可重复的元素 , 有序的选取 , 对应 集合的排列 ; P(n,r)=n!(n−r)!P(n,r) = \dfrac{n!}{(n-r)!}P(n,r)=(n−r)!n!​
  • 不可重复的元素 , 无序的选取 , 对应 集合的组合 ; C(n,r)=P(n,r)r!=n!r!(n−r)!C(n,r) = \dfrac{P(n,r)}{r!} = \dfrac{n!}{r!(n-r)!}C(n,r)=r!P(n,r)​=r!(n−r)!n!​
  • 可重复的元素 , 有序的选取 , 对应 多重集的排列 ; 全排列=n!n1!n2!⋯nk!全排列 = \cfrac{n!}{n_1! n_2! \cdots n_k!}全排列=n1​!n2​!⋯nk​!n!​ , 非全排列 kr,r≤nik^r , \ \ r\leq n_ikr,  r≤ni​
  • 可重复的元素 , 无序的选取 , 对应 多重集的组合 ; N=C(k+r−1,r)N= C(k + r - 1, r)N=C(k+r−1,r)

三、重复有序拆分方案数证明


使用一一对应的方法证明 : 将 正整数 NNN 重复地 , 有序拆分 成 rrr 部分 , 方案数为 C(N−1,r−1)C(N-1, r-1)C(N−1,r−1) ★

拆分后的正整数 , 如果交换了次序之后 , 排列不同 , 其所代表的方案数也不同 ;

将该拆分转换成组合计数问题 ;

假设 N=a1+a2+⋯+arN=a_1 + a_2 + \cdots + a_rN=a1​+a2​+⋯+ar​ 是满足条件的拆分 , 该拆分 重复 , 有序 ;

将上述方案 , 做成部分序列 ,

拆分方案 与 拆分序列 :

根据拆分方案写出拆分序列 :

原始方案 6=1+2+36=1+2+36=1+2+3 , 由原始方案作部分序列 ,

第一个序列 S1=1S_1 = 1S1​=1 , 取原始方案的第一个成分 111 出来 ,

第二个序列 S2=1+2=3S_2 = 1 + 2 = 3S2​=1+2=3 , 取原始方案的前两个成分 1+21 + 21+2 出来 ,

第三个序列 S3=1+2+3=6S_3 = 1 + 2 + 3 = 6S3​=1+2+3=6 , 取原始方案的前三个成分 1+2+31 + 2 + 31+2+3 出来 ,

第一个序列是第一个数 , 第二个序列是前两个数 , 第 nnn 个序列是前 nnn 个数 , 最后一个序列包含了所有的拆分的正整数 ;

只要给定一个原始方案 , 就可以作出上述部分序列出来 ;

只要方案相同 , 作出的序列完全相同 , 方案不同 , 作出的序列肯定不相同 ;

根据拆分序列写出拆分方案 :

反之 , 给定一个序列 , 可以 还原出一个拆分方案来 , 如给出序列 S1=1,S2=3,S3=6S_1 = 1 , S_2=3, S_3=6S1​=1,S2​=3,S3​=6 , 对应的拆分方案 :

最后一个序列式所有数之和 , 被拆分的正整数就是最后一个序列的数值 666

第一个正整数 就是第一个序列 111

第二个正整数 是第二序列减去第一序列 S2−S1=3−1=2S_2 - S_1 = 3-1=2S2​−S1​=3−1=2

第三个正整数 是第三序列减去第二序列 S3−S2=6−3=3S_3-S_2=6-3=3S3​−S2​=6−3=3

拆分方案是 6=1+2+36 = 1+2+36=1+2+3

N=a1+a2+⋯+arN=a_1 + a_2 + \cdots + a_rN=a1​+a2​+⋯+ar​ 的拆分序列是

S1=a1S_1 = a_1S1​=a1​

S2=a1+a2S_2= a_1 + a_2S2​=a1​+a2​

S3=a1+a2+a3S_3= a_1 + a_2 + a_3S3​=a1​+a2​+a3​

⋮\vdots⋮

Si=a1+a2+a3+⋯+ai=∑k=1tai,i=1,2,3,⋯S_i= a_1 + a_2 + a_3 + \cdots + a_i = \sum\limits_{k=1}^ta_i\ , \ \ \ \ \ i=1,2,3, \cdotsSi​=a1​+a2​+a3​+⋯+ai​=k=1∑t​ai​ ,     i=1,2,3,⋯

上述的拆分序列一定有下面的性质 :

0<S1<S2<⋯<Sr=N0 < S_1 < S_2 < \cdots < S_r = N0<S1​<S2​<⋯<Sr​=N

因为 S2S_2S2​ 肯定是 S1S_1S1​ 加上一个正整数 , SrS_rSr​ 肯定是 Sr−1S_{r-1}Sr−1​ 加上一个正整数 , 最后一项是所有的 rrr 个正整数之和 , 是被拆分的正整数 NNN ;

上述拆分序列 S1,S2,⋯,SrS_1, S_2, \cdots , S_rS1​,S2​,⋯,Sr​ , 最后一个数 Sr=NS_r = NSr​=N ,

最后一个数不管 , 前面的 r−1r-1r−1 个数的取值范围是 1,2,3,⋯,N−11, 2, 3, \cdots , N-11,2,3,⋯,N−1 , 上述取值范围内 有 n−1n-1n−1 个正整数 ;

从 n−1n-1n−1 个正整数中 , 选取 r−1r-1r−1 个正整数 ,

因此, 将 正整数 NNN 重复地 , 有序拆分 成 rrr 部分 , 方案数为 C(N−1,r−1)C(N-1, r-1)C(N−1,r−1) ★

【组合数学】生成函数 ( 正整数拆分 | 重复有序拆分 | 不重复有序拆分 | 重复有序拆分方案数证明 )相关推荐

  1. 【组合数学】生成函数 ( 正整数拆分 | 无序 | 有序 | 允许重复 | 不允许重复 | 无序不重复拆分 | 无序重复拆分 )

    文章目录 一.正整数拆分 二.无序拆分 1.无序拆分 不允许重复 2.无序拆分 允许重复 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与 ...

  2. 【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )

    文章目录 一.正整数拆分总结 二.正整数拆分示例 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多 ...

  3. 【组合数学】生成函数 ( 正整数拆分 | 正整数拆分基本模型 | 有限制条件的无序拆分 )

    文章目录 一.正整数拆分基本模型 二.有限制条件的无序拆分 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...

  4. 自然数拆分(完全背包问题求方案数)

    给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复. 注意: 拆分方案不考虑顺序: 至少拆分成2个数的和. 求拆分的方案数 mod 2147483648的结果. 输入格式 ...

  5. Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组

    Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组.split函数垂直拆分二维numpy数组 目录

  6. pandas将dataframe中的内容为列表(list)的数据列裂变、拆分为多个新的数据列实战:拆分为多个新的数据列(并指定新数据列的名称)、数据列中的列表(不等长)拆分为多个新的数据列产生NaN

    pandas将dataframe中的内容为列表(list)的数据列裂变.拆分为多个新的数据列实战:拆分为多个新的数据列(并指定新数据列的名称).数据列中的列表(不等长)拆分为多个新的数据列(产生NaN ...

  7. Excel表格拆分成多个表格,蜂鸟转换帮您快捷拆分

    Excel表格是用来整理数据使用的,很多办公族会在表格下存储很多数据,当表格中的数据比较多时,想要将表格数据分开整理时,大家可以新建表格,将就表格中的部分数据复制到新建表格中,同时也可以将一个表格拆分 ...

  8. 组合数学——生成函数

    生成函数 标题 生成函数 普通型生成函数 基本运算 加法运算 乘法运算(卷积) 幂级数的封闭 求导型 牛顿二项式定理型 倒数型 积分型 幂级数的展开 应用 例题 总结 生成函数(generating ...

  9. 【数据结构笔记】将两个递增的有序链表合并为一个递增的有序链表

    将两个递增的有序链表合并为一个递增的有序链表.要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间.表中不允许有重复的数据. [题目分析] 合并后的新表用头指针Lc指向,pa和pb分别 ...

最新文章

  1. Oracle中的NULL(二、NULL详解)
  2. poj 2337 Catenyms 【欧拉路径】
  3. 图像编程魔法门(By C#) 目录
  4. 优化算法optimization:Adam
  5. LNMP下目录访问验证
  6. 微信公众号文章质量评分算法详解
  7. 关于能否命令Scrum团队的对话
  8. dotnet core开发体验之开始MVC
  9. Java概述、环境变量、注释、关键字、标识符、常量
  10. 【英语学习】【Daily English】U14 Transportation L03 Sorry for keeping you waiting
  11. BaseRecyclerViewAdapterHelper: 灵活强大的循环适配器
  12. tex中让公式和文字在一行_1行代码搞定LaTeX公式编写,这个4.6M的Python小插件,堪称论文必备神器...
  13. PML调用PDMS内核命令研究
  14. VINS-Mono代码分析与总结(完整版)
  15. gcov 使用注意事项
  16. 微信公众号支付开发全过程
  17. 关于jenkins自动化打包探索
  18. python--基础知识点--继承、多态、鸭子类型
  19. 戴尔笔记本电脑USB口失灵
  20. socket网络编程封装错误处理函数

热门文章

  1. Oracle For Linux安装脚本
  2. Sms中关于操作系统的部署之上
  3. day16T2改错记
  4. 为什么static成员一定要在类外初始化?
  5. SqlServer跨集群升级
  6. eclipse编码设置
  7. Redis在APP中的应用
  8. 201521123011《Java程序设计》第6周学习总结
  9. AS3.0函数定义的方法
  10. http和HTTPS的区别及SSL介绍