zoukankan      html  css  js  c++  java
  • 「笔记」组合数学

    组合数学

    写在前面

    题做不动了,来写点笔记

    计数原理

    抽屉原理

    (n + 1) 件物品放入 (n) 个抽屉里,至少有一个抽屉放了 (2) 个物品

    这不是很显然?

    容斥原理

    在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。——百度百科

    类似于去交集并集之类的。功能很明确,计数时没有重复没有遗漏,结合实际问题可能要复杂些,脑子不够用

    组合问题分类

    具体分为四种:

    • 存在性问题:判断满足某种条件的情况或状态是否存在
    • 计数性问题:存在多少种满足某种条件的情况或状态
    • 构造性问题:如果以判断出满足某种条件的状态是存在的,那么如何构造出来
    • 最优化问题:找出某种评价标准下的最佳(或较佳)构造方案

    排列

    (n) 个物品中选 (k) 个物品的方案数,(先后顺序不同为两种方案)

    [P(n, k) = frac{n!}{(n - k)!} ]

    圆排列

    (n) 个物品中选 (k) 个不分首尾的围成一个圆圈

    方案数为:

    [frac{P(n, k)}{k} = frac{n!}{(n - k)! imes k} ]

    组合

    (n) 个物品中选 (k) 个,(先后顺序不同为一种方案)

    定义式:

    [inom{n}{m} = frac{n!}{m!(n - m)!} ]

    或者

    [C_n^m = frac{n!}{m!(n - m)!} ]

    Lucas 定理

    就是一个公式:

    [C^m_n = C_{n/p}^{m/p} imes C_{n mod p}^{m mod p} ]

    也可以写作:

    [Lucas(n, m) = Lucas(n / p, m / p) imes C_{n mod p}^{m mod p} ]

    其中 (Lucas(n, 0) = 1) ,利用这个在递归的时候返回即可

    一般应用于 (n)(m) 很大的时候,可以大大简化运算,但要注意 (p) 必须是质数

    如果模数不是很大,可以预处理出 (1 sim mod - 1) 的阶乘和逆元进行优化

    例题P3807【模板】卢卡斯定理

    组合数学的一些思想方法

    插板法

    一个典型的例子

    (n) 个小球放进 (k) 个箱子里,求有多少种放法

    • 空隙间必须有值的情况(每个箱子里至少有一个球):

    考虑将 (n) 个小球排成一列,每两个小球间会有一个空隙,一共有 (n - 1) 个空隙。把箱子看成板子,插入空隙里,显然只要插 (k - 1) 个板子就能把小球分成 (n) 份,所以答案为

    [C_{n - 1}^{k - 1} ]

    • 空隙间可以为空的情况(箱子里可以不放球):

    与上面不同的是,两个板子可以同时插在一个地方,所以相当于多了 (k) 个可以插的地方,所以答案为:

    [C_{n + k - 1}^{k - 1} ]

    几个问题

    Question 1

    (n) 个不同元素,选 (r) 个,可重复选,求方案数
    求证: (ans = C_{n + r - 1}^{r})

    思路:

    设当 (n) 个元素中选 (r) 个不重复的元素时

    [1 le x_1 < x_2 < ... < x_r le n ]

    那么当从 (n) 个元素中选 (r) 个可重复的元素时

    [1 le x_1 le x_2 le ... le x_r le n ]

    (y_i = x_i + i - 1)

    那么上式可表示为

    [1 le y_1 < y_2 < y_3 < ... < y_r le n + r - 1 ]

    发现与第一个不等式形式相同,所以答案类似是 (C_{n + r - 1}^{r})

    因为对于每个 (x_i) 都有唯一的 (y_i) 与之对应,所以问题的答案也为 (C_{n + r - 1}^{r})

    证毕。

    Question 2

    (n) 个元素,从中选 (r) 个不相邻的元素,求方案数
    求证: (ans = C_{n - r + 1}^{r})

    思路同 Question 1, 把 (y_i = x_i + i - 1) 改为 (y_i = x_i - i + 1),用相同的思路去推导即可

    Question 3

    [sum_{k=1}^{n}(C_{n}^{k})^2 ]

    解:

    [egin{alignedat}{3} sum_{k=1}^{n}(C_n^k)^2 & = sum_{k=1}^{n}C_{n}^{k} imes C_{n}^{k} \ & = sum_{k=1}^{n}C_{n}^{k} imes C_{n}^{n - k} \ & = C_{2n}^{n} \ end{alignedat} ]

    然后就做完了。

    这样做的意义是啥?
    这就是在前 (n) 个元素中选 (k) 个,在后 (n) 个元素中选 (n - k) 个(选 (k) 个和选 (n -k) 个是一个意思)的方案数

    为什么 (C_{2n}^{2k}) 不对?
    因为这样你无法确定在前 (n) 个元素中选择了几个,在后 (n) 个元素中选择了几个

    组合数及其相关性质

    (C_{n+m}^{n} = C_{n+m}^m)

    实际意义:从 (n+m) 个元素中选 (n) 个元素的方案数与选 (m) 个元素 剩下 (n) 个元素的方案数相同

    (C_{n}^{m} = C_{n - 1}^{m - 1} + C_{n - 1}^{m})

    暴力推导

    [frac{(n - 1)!}{(m-1)! (n - m)!} + frac{(n - 1)!}{m! (n - m - 1)!} = frac{n!}{m!(n - m)!} ]

    对左式进行通分合并就可以得到右式了

    过程也很简单,在这里就不赘述了

    实际意义:从 (n) 个里面选 (m) 个,对于最后一个元素,我们考虑两种情况:选或不选。如果选,那么还要在剩下的 (n - 1) 个元素中选择 (m - 1) 个元素;如果不选,那么还要在剩下的 (n - 1) 个元素中选择 (m) 个元素。
    两种情况是并列的,因此把两种情况的方案数加起来即可。

    其实这个式子还有另外一个名字:组合数的递推式。
    也就是你可以从 (C_{1}^{1}) 采用递推的方式推到 (C_{n}^{m})
    如果你把整个递推出来的三角形列出来的话,会发现这是一个杨辉三角
    各位有兴趣的话可以稍微在打草纸上一划,就很容易看出

    (C_{n+r+1}^{r} = C_{n+r}^{r} + C_{n + r-1}^{r-1} + ... + C_{n}^{0})

    这个式子其实可以从上面那个式子进行更进一步的推导推出来

    即来考虑更多的元素是否选择的情况

    (C_{n}^{l}C_{l}^{r} = C_{n}^{r}C_{n-r}^{l-r})

    实际意义:在 (n) 个元素中先选 (l) 个元素,再在这 (l) 个元素中选 (r) 个元素的方案 等于 在 (n) 个元素中先选 (r) 个元素,再在剩下的 (n - r) 个元素中选择 (l - r) 个元素的方案。因为两次操作是递进的(或者说有先后的),所以计算的时候是相乘的形式,也就是上面的捏个等式

    (C_{n}^{0} + C_{n}^{1} + ... + C_{n}^{n} = 2^n)

    含义(n) 个元素,从中选任意个元素的方案数。

    考虑对每个元素选或不选,对于每个元素都有两条路可走,所以 (n) 个元素随便选或不选的方案数为 (2^n)

    另一个含义:把 (n) 个元素看做一个长度为 (n) 的 01 串,那么这个串中的 (1) 的个数对应着每种方案(或是 (0) 的个数),又因为这个 01 串能表示的数有 (0 o 2^n - 1)(2^n) 个数,所以上式的方案数为 (2^n).

    (C_{n}^{0} - C_{n}^{1} + C_{n}^{2} - ... = 0)

    一种理解方式:上面的式子可以看做从 (n) 个元素中选 偶数 个和选 奇数 个的方案是一样的。考虑一个新加的东西选或不选,如果选的话,肯定会由原来的 奇数个 变成 偶数个 (或者 偶数个 变成 奇数个);如果不选的话,就不发生改变。因为两种情况是等概率出现的,因此从 (n) 个元素中选 奇数个 和选 偶数个 的方案数相同

    (C_{r}^{r} + C_{r+1}^{r} + ... + C_{n}^{r} = C_{n + 1}^{r + 1})

    好像和上面某个式子的推导思想一样来

    二项式定理

    [(x+y)^n = sum_{i = 0}^{n}C_{n}^{i} x^i y^{n-i} = sum_{i = 0}^{n}C_{n}^{i} x^{n-i} y^i ]

  • 相关阅读:
    Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0
    Can't connect to MySQL server on '192.168.7.175' (10060)
    单精度浮点数(float)加法计算出错
    当前不会命中断点 还没有为该文档加载任何符号
    64位程序,long*转long 出错
    当前安全设置不允许下载该文件的原因以及图文解决办法
    IndentationError: unindent does not match any outer indentation level
    MongoDB状态查询:db.serverStatus()
    bson.errors.InvalidStringData: strings in documents must be valid UTF-8
    Transformer的PyTorch实现
  • 原文地址:https://www.cnblogs.com/Silymtics/p/14669003.html
Copyright © 2011-2022 走看看