zoukankan      html  css  js  c++  java
  • 详解组合数相关性质

    浅谈组合数相关性质

    本篇随笔简单讲解一下数学中组合数的相关性质。并且,因为博主是一名(OIer)(否则为啥要在高一学组合数),所以在本篇随笔中还会侧重组合数在信息学奥林匹克竞赛中的应用。综上所述,本篇随笔乃是学数学的,学(OI)的,学玄学的,学哲学的同志们的学习佳选。(不要个脸)

    组合数的概念

    这个板块是为对组合数毫无概念的同学留的。因为名字叫做组合数,所以肯定是和组合有关系的。

    我们定义:(C_n^m)为在(n)个元素中选择(m)个元素的不同组合数量,即组合数。

    啥叫组合呢?

    简单来讲,对于一个集合来讲,从中随便拿出任意个元素所构成的一个子集就是组合。需要注意的是,组合和排列不一样,排列的数量还取决于取出的顺序,但是组合的数量只取决于这个组合中有什么元素。

    比如,((1,2,3))((3,2,1))是同一个组合。

    附录:

    如果还不是很明白的小伙伴,可以参考蒟蒻的这篇博客:

    排列组合相关知识

    组合数公式:

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

    组合数的基本性质

    规定

    硬性规定,没有为什么。就像规定(0!=1)一样,不讲道理。

    (C_n^0=1)(C_n^n=1)(C_0^0=1)

    互补性

    [C_n^m=C_n^{n-m} ]

    这个性质口胡起来就是,在含有(n)个元素的集合中选中(m)个元素的组合数等于在这个集合中选中(n-m)个元素的组合数。

    这个性质很好理解和想象。我们每一次搞出一个还没有选过并合法的组合时,总会对应着一个这个组合的补集,而这些补集凑在一起就是(C_n^{n-m})

    这个性质很重要!

    组合恒等式

    除了互补性,还有一个前导公式:

    [C_{n+1}^m=C_n^m+C_n^{m-1} ]

    对于这个公式的理解,可以抽象一下:我们可以把(C_{n+1}^m)看成原本的(n)个元素中加入了一个新元素,那么根据分类计数原理,我们之前已经求出的组合数(C_n^m)中显然少了含有这种新元素的情况。那么就把它加上就好。因为选中这个新元素必定要把一种老元素剔除掉,所以应该加上(C_n^{m-1})

    组合数的求解

    光知道这些数学知识,在(OI)中可是没什么用。所以我们还要了解组合数的求法,在考场上熟练求解组合数,用它解决更大的问题。

    首先,组合数可以用公式求(废话)。我们暴力套用公式,可以求出不爆(Longlong)的组合数。但是这种方法在多次求解组合数的时候显得比较鸡肋。因为多次求解组合数,如果再套公式就会大大增加时间复杂度。这个时候我们可以考虑弄出一份阶乘表,快速调用阶乘答案,来降低时间复杂度。

    然后,我就要介绍信竞中最常用的组合数求法——

    组合数递推法

    组合数是可以递推求的。就是说,所有的组合数都可以由前面的组合数推导而来。

    为什么呢?

    就是因为上面证明过的那个公式:

    [C_{n+1}^m=C_n^m+C_n^{m-1} ]

    我们令(n=n-1),那么就得出新公式:

    [C_n^m=C_{n-1}^m+C_{n-1}^{m-1} ]

    那么,组合数(C_n^m)就可以通过递推来求解了。

    初值是组合数硬性规定:

    (C_0^0=0)(C_0^i=C_0^1=C_1^1=1)

    然后就可以开始递推了。

    递推公式是:

    [f[i][j]=f[i-1][j]+f[i-1][j-1] ]

    我们发现,这个递推公式和另一个递推公式差不多——

    杨辉三角

    关于杨辉三角,如有蒙圈的小可爱请观摩我的这篇博客:

    杨辉三角知识点详解

    总结:

    掌握组合数的概念,知道组合互补性质和组合恒等式的推导过程和结论。掌握组合数求解的通项公式法和递推公式法

    对于组合数求解,有很多题目还卡递推求解,这个时候要再学习一些优化和卡常技巧。希望同学们能够在之后的题目中多多体会和掌握理解。

  • 相关阅读:
    spring bean的作用域
    Web前端开发CSS规范总结
    前端技术都包含哪些?
    Web安全常见问题及解决方法
    如何让手游更省带宽,耗电量更少?TBR渲染架构解析!
    新手学Java,有哪些入门知识点?
    如何让手游内存占用更小?从内存消耗iOS实时统计开始
    动作游戏老是卡?试试从这些方面提升流畅度
    开发者必知!2020年大前端发展趋势解读
    游戏编程入门! 想成为专业的游戏开发程序员需要掌握哪些?
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11838425.html
Copyright © 2011-2022 走看看