[TOC]
组合
$C_n^r=C_{n-1}^r+C_{n-1}^{r-1}$ 对于第n个元素,不取时,相当于前n-1个元素中取r个,取时,是前n-1个元素中取r-1个。
像个杨辉三角:
C(0,0)
C(1,0) C(1,1)
C(2,0) C(2,1) C(2,2)
C(3,0) C(3,1) C(3,2) C(3,3)
….. ….. …..
如果要求解C(n,r),可以先求解出C(n-1,r) 和 C(n-1,r-1);再运用公式相加即可。很明显,这是一个与Fib数列类似的递归计算。只不过求Fib(n)时,只有一个参数,而这里有二个参数而已。(还是直接求把。。还有用dp的方法)
Cayley公式
一个完全图K_n有$n^{n-2}$棵生成树,即n个有标号1~n的顶点的树的个数为:$n^{n-2}$
证明:你画个图
给定一棵带标号的无根树,找出编号最小的叶子节点,写下与它相邻的节点的编号,然后删掉这个叶子节点。反复执行这个操作直到只剩两个节点为止。由于节点数n>2的树总存在叶子节点,因此一棵n个节点的无根树唯一地对应了一个长度为n-2的数列,数列中的每个数都在1到n的范围内。
简化为:n个数字可重复的排列到n-2个位置上去。
不全相异的排列
n个元素组成的多重集,$a_i$重复$n_i$次,$n=∑_{i=1}^kn_i$,从n个元素中选取r个排列,求不同的排列数。
若r=n ,为:$\frac{n!}{n_1!n_2!…n_k!}$
重复排列和重复组合
排列:在n个不同物体中可重复选取r个排列:$n^r$
组合:…… 组合:$C_{n+r-1}^r$
证明组合:对于1~n的x集合中选取r个元素,然后对应的构造r个y集合中的元素,对应关系为:$y_i=x_i+i-1$,
故……
圆周排列
a、b、c、d,普通排列:24,圆周排列:6 = 24/4 也就说;普通数量/个数 = (n-1)!
生成全排列
序数法
任何 $m=a_{n-1}(n-1)!+a_{n-2}(n-2)!+a_{n-3}(n-3)!+……+a_2·2!+a_1·1!$ ①
其中a1 = m%2, a2=(m/2)%3 , a3=(m/2/3)%4 ……直到m/……=0;
那么!a集合($a_{n-1}~a_1$)共有n!种排列对不对!那么怎样把1,2,……n的一个排列和①联系起来呢?
某一个n阶排列的序号是m,那么将m转换为阶乘进制数后,阶乘进制数的第i位就是在i右面比i小的元素个数。例如4阶排列中(从0开始计数的)第19个排列的序号是19,将19转换成阶乘进制数是3010,那么,第一位是0,表明1的右面没有比1小的元素,而第二位是1,则2的右面有一个元素小于2,第三位是0,即3的右面没有比它小的元素,第四位是3,4的右面有3个元素小于它。显然,这个排列是4 2 1 3。
字典序法
很简单就是1234 、 1243、 1324、 1342、……这样的全排列生成顺序
方法是:eg:上一个排列数为:3421 (p.s.以下的i j k都是下标) 1~n
- 求$ i = max ( j|a_j-1<a_j ) = 2$
- 求$ j = max(k|a_i-1<a_k)= 2$
- 交换$a_i-1$ 和 $a_j$ ,得:4321
- 将$a_ia_{i+1}a_{i+2}……a_n$逆序:得4123。
Poj 1833 可以使用stl中的next_permutation(op1,op2)自动生成字典序的下一个全排列。
op1是放排列的数组首地址a,op2是排列的长度a+n。
到最后一个排列时返回为false。
但是这一题卡输出,用stl的
1 | copy(a,a+n-1,ostream_iterator<int>(cout," ")); |
参考用法:
1 |
|
邻位互换法
计蒜客构造题 [bellring]
仔细想想不就是把n插入到已完成的n-1阶排列的不同位置中得到n阶排列吗?
n=1; 1
n=2; 12 , 21
n=3; 123, 132, 312, 321, 231, 213
……
用这种方法可以产生出任意n阶全排列,(而且符合bellring中的移动规律,即每个数移动的位置最多为1,就能一下子构造出n!个不重复的全排列)
1 | /** |
卡特兰数
$$
a_{n}=\frac{4n-2}{n+1}a_{n-1}
$$
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, … …
该递推关系的解是:
$$
a_{n}=\frac{C_{2n}^{n}}{n+1} (n=1,2,3,…)
$$
eg. 出栈的种数与卡特兰数:
① 对于出栈序列中的每一个数字,在它后面的、比它小的所有数字,一定是按递减顺序排列的。
② 给定一个入栈顺序:1 2 3 …. n,一共有多少种合法的出栈顺序?
答案是 卡特兰数。即一共有:$h(n)=\frac{C_{2n}^{n}}{n+1} $ 种合法的出栈顺序。
如果仅仅只需要求出一共有多少种合法的出栈顺序,其实就是求出组合 C(2n,n)就可以了。
组合数模板
n,m大,MOD小
1 |
|
n,m小,mod大
1 |
|
n,m很小
1 |
|
母函数
定义:对于序列$a_0,a_1,a_2 … $构造一个函数:
$$
G(x)=a_0+a_1x+a_2x^2+…
$$
则,函数G(x)就是序列$a_0,a_1,a_2…$的母函数。
比如说一个普通型母函数的应用:
有质量为1,2,3的砝码各一枚:
(1)可以称出多少种不同的质量?
解:1个1g砝码可以用1+x表示,1表示不用,x表示用1g砝码
1个2g砝码可用$1+x^2$表示……
1个3g砝码$1+x^3$……
则其母函数$G(x)=(1+x)(1+x^2)(1+x^3)=1+x+x^2+2x^3+x^4+x^5+x^6$
x上的指数表示质量,x前的系数表示搭配种类。
故可以称出6种。
(2)若砝码有无穷个?
解:以2g砝码为例,那么2g砝码可以组成:$(1+x^2+x^4+x^6……)$
因此:$G(x)=(1+x+x^2+x^3+……)(1+x^2+x^4+x^6+……)(1+x^3+x^6+x^9+……)$
模板:
1 | //这个比较快速 |
例题:HDU2082
示例代码:
1 |
|
整数拆分
//大整数分解模板
1 | typedef long long ll; |
Ferrrs图像
一个自上而下的n层各自组成的图像,$m_i$为第i层的格子数。当$m_i≥m{i+1}$,即上层的格子数不少于下层的格子数时,称之为Ferrers图像。
绕$y=-x$旋转得到的图像仍然是Ferrers图像,这样两个称为一对共轭Ferrers图像。
整数的拆分也可以用这个图像来表示。
可根据图像证明定理:整数n拆分成k个数的和的拆分数,与数n拆分成最大数为k的拆分数相等。
eg:24=5+5+5+4+3+2 的图像 共轭图像的话,24=6+6+5+4+3,
可以看出,24拆分成6个数的最大数=24拆分成最大数为6的拆分数
……
指数型母函数
在不全相异的排列那一p里面,r=n可以容易求出,但是当r一般情况的时候就复杂了。
对于给定的数列$a_0,a_1,a_2,…,a_n,…,$通常称为形式幂级数,即:
$$
Σ_{n=0}^∞\frac{a_n}{n!}x^n=a_0+a_1x+\frac{a_2}{2!}x^2+\frac{a_3}{3!}x^3+…+\frac{a_n}{n!}x^n+…
$$
为数列$a_0,a_1,a_2,…,a_n,…$的指数型母函数,这里规定0!=1。
这样,对于一个多重集,其中$a_i$重复了$n_i$次,$n=∑_{i=1}^nn_i$,从n个元素中取r个元素排列,不同的排列数对应的指数型母函数:
$$
G(x)=(1+\frac{x}{1!}+\frac{x^2}{2!}+…+\frac{x^{n_1}}{n_1!})(1+\frac{x}{1!}+\frac{x^2}{2!}+…+\frac{x^{n_2}}{n_2!})+…+(1+\frac{x}{1!}+\frac{x^2}{2!}+…+\frac{x^{n_k}}{n_k!})
$$
例题:有1,2,3,4,个数字组成的五位数中,要求数1出现次数不超过2次,但不能不出现;2不超过1次;3最多3次,可以不出现;4出现次数为偶数。求满足上述条件的数的个数。
解:$C_r$对应的指数型母函数为
$$
G(x)=(\frac{x}{1!}+\frac{x^2}{2!})(1+\frac{x}{1!})(1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!})(1+\frac{x^2}{2!}+\frac{x^4}{4!})
$$
解得x上指数为5的系数为215。
p.s.4的偶数次之所以到$x^4$是因为再多也不满足条件啊。
HDU排列组合 题
1 |
|
递推关系
斐波那契
斯特林数 Stiring
###第一类斯特林数
有正负,其绝对值是包含n个元素的集合分作k个环排列的方法数目
递推公式:
S(n,0)= 0
S(1,1) = 1
S(n+1,k)= S(n,k-1) + nS(n,k)
第三个式子是这样的,n+1个元素分成k个环,可以理解为前n个元素分成k-1个环,第n+1个自成一个环的种类数量,加上前n个元素分成k个环,第n+1个元素插入到第i个元素左边。
模板
1 | //第一类Stirling数s(p,k)计数的是把p个对象排成k个非空循环排列的方法数 |
第二类斯特林数
将包含n个元素的集合划分为正好k个非空子集方法的数目
递推公式:
S(n,k)= 0(n<k ||k==0)
S(n,n) = S(n,1) = 1
S(n,k)= S(n-1,k-1) + kS(n-1,k)
第三个式子是这样的,n个元素分成k集合,可以理解为前n-1个元素分成k-1个集合,第n个自成一个集合的种类数量,加上前n-1个元素分成k个环,第n个元素在k个集合中选择放到里面去。
模板
1 | /* |