[学习?]组合和排序

组合和排序

(假如有同学不小心进来了,那也没事,博是给我自己写的,但你们千万不要笑我,认真!)

组合和排序是OI学生们的基本功,其重要性不言而喻。(而我认为它的最大作用就是解决生物的遗传问题!)

这注定是一个废掉的下午,顶着同学们都在打假期题的危机,我开始一个人神游。

、( -  A   - )、

基本定义:

c‘check here 百科

c‘check here 文库

感受着互联网带我们的便捷,于是我就转了百度百科。

组合数(combinatorial number):

从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合;从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。

套路上说,鉴于人们对用数学描摹一切未知事物的热情,于是一个可爱的公式出现了。

组合数计算公式:

最基本的有:

特别的有,c(n,0)=1(这个其实也和后面的拓展有关系)

接着是拓展:

C(n,m)= C(n,n-m)= C(n-1,m-1)+C(n-1,m)

怎么理解这个公式?(因为我给不了证明啊)

首先:

C(n,m)= C(n,n-m)

这个公式好说,既然我们确定确定一种组合的组合数(c(n,m)),另一种组合数也就固定了。(补集思想!)

但:

C(n,m)= C(n-1,m-1)+C(n-1,m)

显然,这是一个递推式,但这个就有点麻烦了。

于是机智的我翻到了一种理解方式:

现在我们有n+1个球,我们从里面选m个。 这个我们知道共有C(m,n+1)种选法。

然后我们在这n+1个球里随便挑一个,叫它a球。

那么在这C(m,n+1)种选法里就分成了两类,且只有这两类。

一类是选出来的m个球里没有a球。 这类选法数量等价于n个球里选m个,就是C(m,n) 还有一类是选出来的m个球里有a球。

 这类选法数量等价于n个球里选m-1个,就是C(m-1,n)

这下是不是好记多了?

排序数(Arrangement number):

从n个不同元素中任取r(r≦n)个元素排成一列(考虑元素先后出现次序)称此为一个排列,此种排列的总数即为排列数,即叫做从n个不同元素中取出r个元素的排列数。

又是套路。

排序数计算公式:

排序貌似没什么好说的?

排序数和组合数的关系:

还记得上面的那个两个基本公式么,看看这张图,是不是明白排序数的公式是怎么来的了?(其实就是在原来的组合数公式上*A(n,n),也就是*n!)

还有一些话:

这次noip有个interesting的题:组合数问题,但和这个组合数公式并无太大关系。

真的要算组合数,那就直接拿原式即可。

如果你还想取模,那就找 this

动态规划,杨辉三角...怎么想好像都不妥。

二项式定理:

真的不会!

2017.6.6_16:42:16  :   大部分内容待补,今天先跑(还有生物题!)。

时间: 2024-11-13 08:01:19

[学习?]组合和排序的相关文章

《大话数据结构》学习笔记 排序

排序的严格定义:  假设含有n个记录的序列为{r1,r2,......,rn},对应的关键字分别为{k1,k2......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字 满足Kp1<=Kp2<=......Kpn关系,即使得序列成为一个按关键字有序的序列(rpq,rp2,......rpn),此操作称为排序.  排序的稳定性:内排序与外排序(根据记录是否全部放置在内存中). 根据排序中的主要操作,可以分为插入排序类(直接插入排序->希尔

Python学习——数据排序方法

Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2,6,432,78,43,22,896,42,677,12] >>> data1.sort() >>> data1 #原来的顺序被替换 [2, 4, 6, 12, 22, 42, 43, 78, 432, 677, 896] 2. 复制排序:采用sorted()内置函数,按照

hdu3342(Legal or Not)----- 学习拓扑排序的好例题

经典拓扑排序 点击打开链接 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exch

C语言学习_排序_插入排序

1.插入排序 #include <stdio.h> #include <stdlib.h> #define M 100 int main(void) { int i, j, n; int a[M] = {0}; printf("input n:"); scanf("%d", &n); printf("input a:"); for(i = 1; i <= n; i++) //从a[1]开始,也就是第二个数 s

Excel 学习笔记——排序,筛选,查找,定位,分类汇总和数据有效性及 细节操作技巧

Excel 学习笔记   课程内容:查找.替换.定位 想要实现的目标内容: 1.       替换指定内容,例:苏州 <- 苏州市  红色背景色<- 黄色背景色 将"张某某"替换为"经理的亲戚" 2.       定位特定位置的单元格,类似筛选功能(mac 系统中 暂时未发现定位按钮) 3.       批注 修改 删除 变换形状 隐藏命令 利用的工具,手段(操作按钮的名称,位置): 1.1   查找和替换-选项-单元格匹配 用来锁定指定单元格,避免类似

hadoop 学习自定义排序

(网易云课程hadoop大数据实战学习笔记) 自定义排序,是基于k2的排序,设现有以下一组数据,分别表示矩形的长和宽,先按照面积的升序进行排序. 99 66 78 11 54 现在需要重新定义数据类型,MR的key值必须继承WritableComparable接口,因此定义RectangleWritable数据类型如下: import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import

DataTable学习笔记---排序细则、列隐藏

耽误了好几天,因为要做一个嵌入式的实验-android内核编译与裁剪,很久之前装的wubi不知道为什么运行出错了,然后看着当前的win7系统觉得有点讨厌了,也是因为快1年半没装机了,所以就重新装机了,结果就各种杯具,统计装了2次win7,2次win8,2次wubi,期间碰到了不知多少问题,另一方面限于这可恶的网速,着实让我蛋疼了一把,然后又是各种压力,本人大三了,到了要找实习单位的时候,还有是否决定考研,也挺烦心的.今天趁着有点时间了,继续我们的dataTable学习吧.    1.DataTa

算法学习之排序的那些事(一)

????????排序的目的就是对一组无序的元素按照一定的次序排列起来.那么总的来说排序要做到事情就只有两件,找到各个元素按照一定次序排列后的位置并把各个元素移动到其所对应的位置.由此看出决定一个排序算法效率的因素也就是这两个: 寻找元素位置所消耗的时间 移动元素到其对应位置所消耗的时间 下面是一些常用的排序算法: 冒泡排序: 算法描述:算法比较简单就不多描述了. 实现步骤: 对N个元素做N-1次循环(每次循环至少可以把一个元素移动的正确的位置,N-1次循环后便把N个元素排列好了) 每次循环进行N

[算法学习笔记]排序算法——堆排序

堆排序 堆排序(heapsort)也是一种相对高效的排序方法,堆排序的时间复杂度为O(n lgn),同时堆排序使用了一种名为堆的数据结构进行管理. 二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 如上图显示,(a)是一个二叉堆(最大堆), (b)是这个二叉堆在数组中的存储形式. 通过给个一个节点的下标i, 很容易计算出其父节点,左右子节点的的下标,为了方便,