排列组合浅谈
初步:加法原理和乘法原理
概念:
加法原理是分类计数原理,常用于排列组合中,具体是指:做一件事情,完成它有n类方式,第一类方式有M1种方法,第二类方式有M2种方法,……,第n类方式有Mn种方法,那么完成这件事情共有M1+M2+……+Mn种方法。
做一件事,完成它需要分成n个步骤,做第一 步有m1种不同的方法,做第二步有m2种不同的方法,……,做第n步有mn种不同的方法。那么完成这件事共有 N=m1×m2×m3×…×mn 种不同的方法。
这个感觉大家都知道(小学奥数就开始学了吧qwq),感觉没有什么好说的qwq
例题参照:AHOI2009 中国象棋
这个题因为和DP结合,状态设计比较难想。但是当我们用
dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod;
//这一行什么都不放
dp[i][j-1][k+1]=(dp[i][j-1][k+1]+j*dp[i-1][j][k])%mod;
//这一行在原先只有一个棋子的那一列放一个棋子
dp[i][j+1][k]=(dp[i][j+1][k]+(m-k-j)*dp[i-1][j][k])%mod;
//这一行在原先没有棋子的那一列放一个棋子
dp[i][j+2][k]=(dp[i][j+2][k]+(m-k-j)*(m-k-j-1)/2*dp[i-1][j][k])%mod;
//这一行在原先没有棋子的两列分别摆放一个棋子
dp[i][j][k+1]=(dp[i][j][k+1]+(m-k-j)*dp[i-1][j][k]*j)%mod;
//这一行在原先有一个棋子和没有棋子的两列分别放一个
dp[i][j-2][k+2]=(dp[i][j-2][k+2]+j*(j-1)/2*dp[i-1][j][k])%mod;
//这一行在原先有一个棋子的两列分别摆放一个棋子
加法原理和乘法原理的区别:
一个与分类有关,一个与分步有关;加法原理是 “分类完成”,乘法原理是 “分步完成”。
初识排列
定义
从
计算公式
常见问题
1、全排列问题
2、部分排列
就是上面的计算公式qwq
初识组合
定义:
(解释:因为要考虑顺序,选出来的那m个人还需要全排列)
公式:
1、
2、
3、
4、
5、
-
对于第二个公式应该很好理解,就是反选,方案数量自然是一样的。这体现的是它良好的对称性。
-
第三个公式平常用来递推。可以划分为子问题理解:为如果选第m个数,那么就是在n-1个数里面选择m-1个数,如果不选第m个数,就是在n-1个数里面选m个数。证明如下:
- 第四个公式很好证明(展开即可),这里介绍它的应用:(二项式展开)求
(a+b)^n 展开式的各项系数。 这里就可以直接利用公式做了:
有限的可重复元素的排列
假设现在有n个元素,对于第一类元素
附上一张来自wikipedia的图帮助理解:
无限的可重复元素组合问题
上面讲解的是有限的可重复元素排列问题,下面讲无限的可重复元素排列问题(就是每个元素都可以用无限多次参与排列)
现在我们从m个元素中选择k个元素的,然后我们将这k个元素进行排序之后应该是这个样子:(设我们选择的数为编号为
那么现在我们将等于号消去:
现在我们设
那么现在问题就转换成了在
同理还有求编号在1~n的元素中取k个元素,使得他们的编号不相邻。公式是一样的,证明也是一样的。
二项式
这里有一张来自wikipedia的图,我觉得特别棒 二项式的系数公式:
(可以看到,其实也可以用杨辉三角表示) 综合起来就是
错排问题
错排就是诸如有1~n n个人,每个人按照1~n进行编号,现在要让他们排成一队,但是每个人不能在自己编号上的问题。
对于这个问题,luogu日报已经有专门的一期来进行详细的讲解~~ 传送门——戳我~~
圆排
从n个不同元素中不重复地取出m(1≤m≤n)个元素在一个圆周上,叫做这n个不同元素的圆排列。如果一个m-圆排列旋转可以得到另一个m-圆排列,则认为这两个圆排列相同。
n个不同元素的m-圆排列个数N为:
特别地,当m=n时,n个不同元素作成的圆排列总数N为:
环上的染色问题
现在一个环被分成了n段,要求每一段上都涂上颜色。一共有k种不同的颜色,涂好之后两两相邻颜色不能相同。问有多少种涂色方案?
这个问题我们可以这样考虑:
第一种情况:如果我们把原先的环看作只有
第二种情况:我们把原先的环看作
这是一个二阶常系数递推式,推导之后通项公式如下:
例题参照:
NOIP2017 组合数问题 这个没什么好说的,就是杨辉三角
codeforces 991E 可重复元素的排列+搜索
HNOI2008 越狱 我们直接考虑不太方便,但是可以想到补集转换,算出来所有的方案数然后减去不合法的就很简单了qwq,之后就是快速幂的模板了qwq
nowcoder 选择颜色 环上的颜色选择问题,相邻要求不同色。
THUPC2018 蛋糕 / Cake 先从三维的情况开始想。 发现对于任意一个方块,它染色的面数k就是它有k个维度在边界上。 写四个for套在一起,分别枚举每一维是不是处于边界上,对于每个维度,分别算出这一维可能的情况数量,再根据乘法原理,把每个维度的结果乘起来,再根据加法原理,把这个乘起来的数字累加到答案里面就ok了。
以上。。。如果有误,欢迎各位dalao指出啦~~