组合数学
这是一个和高考接轨的东东,先复习一下加法和乘法原理,
加法原理:就是一个点有三条路可以到达,那么现在有多了2条路,一共是不是2+3=5条路。
乘法原理:三个点,第一个点有3条路到第二个点,第二个点有2条路到第三个点,一共第一个点到第三个点有6条路。
排列数
下一个就是排列数,这个主要是对顺序没要求的时候也用
在这里插入图片描述
组合数
组合数,这个是ab,ba看成一种的时候用的
例题
错排问题
卡特兰数
只要满足上面那个递推关系式的就是卡特兰数,eg
n 对括号正确匹配数目
n 个节点组成二叉树的个数
n 边形三角划分方案数
n 个点依次进栈的出栈顺序
n×n 的矩阵从左下角走到右上角不穿过对角线
那么我们肯定就要知道这个如何去算啦,
这个就是如何去算,以及对于公式的一个简单的推导,这个主要就是在考试的时候可以看出来这是一个卡特兰数,其实h(n)表示的就是方案数。
lucas定理
这个在我的数学问题博客里面,子集找找吧哈哈哈哈。
经典问题一
P1044 [NOIP2003 普及组] 栈
首先我们发现对于一个数字x,他的进入输出数组的方式是不是先把小于他的数输出的方案 * 大于他的数字输出的方案,
所以说f[n] = f[0] * f[n-1] + f[1] * f[n - 2]…
这里可以感性的理解,首先当小于x的数个数为0,那么大于他的数字的个数就是x - 1所以可以推出这个关系,之后就是计算了
经典问题二
P1025 [NOIP2001 提高组] 数的划分
把问题转化,其实就是n个果子(我最爱的果果哈哈哈)放进k个筐子里,每一个框子本质是一样的,的方案数
这个其实很简单,我们发现把n个果子放进去的方案数 =
把n - 1 个果子放进 k - 1个框子的方案 + 在每一个框子又有一个果子的情况下把n - k 个果子放入k个框子内的方案
这里是为什么呢,首先对于加号前的表达式是不是很好理解,这里面我们漏掉了什么,其实就是最后一个框子里面我们可以放入不止一个果子,那么我们在保证每一个框子都有一个果子的情况下是不是就把这个给包含上了。
经典问题三
P2822 [NOIP2016 提高组] 组合数问题
没错是个比较简单的题,但是我当时竟然没有想到这个学过的性质
首先杨辉三角是组合数这个大家应该都知道,看一下数据范围,要预处理之后O(1)查找没跑了,所以说我们就可以用杨辉三角去求出所有的在数据范围内的组合数在mod k意义下的值(这里也可以防止爆longlong)
之后就是考虑如何查询,对于一个询问nm我们可以发现它包含的范围是不是一个矩形,而这个矩形是不是可以由n-1.m , m-1.n ,m-1.n-1用容斥原理拼出来,所以只用看这个c[n][m] 是不是可以被k整除
所以这是不是就完成了
最后注意一下两个细节
1.这个题其实n >= m 所以这个答案并不是一个矩形,而是一个三角,所以要去考虑边界,对于每行最后一个,我们发现他的头上是无人给赋值的,但是这个值其实和右上角的一样,所以要注意把这个给单独附上值
2.但是输入时没有规定n >= m所以假如m>n我们就要把m = n,至于m>n的部分显然时无意义的