一、基本公式
(特殊的,0!=1)(以下n>=m)
排列:
表示从n个数中取出m个数来排列的方案总数,忽略顺序。例如:m=2时,(1,2)是一种,(2,1)是另一种。
组合:
表示从n个数中取出m个数来组合的方案总数,限制顺序。可以理解为从n个数中取出m个数有多少种取法。例如:m=2时,(1,2)和(2,1)是同一种。m=3时,(1,2,3)和(1,3,2)以及(2,1,3)等是同一种。
二、经典例题
1、将n个相同的球放进m个不同的盒子里。球要放完,盒子不能为空,问有多少种放法。
解:题目等价于有n个球,要在两个球之间插板子(两个球之间最多能插一个),将球分为m个部分。n个球,有n-1个空隙可以插;m个部分,只用m-1个板子。
所以又可以等价于有n-1个板子,只需要取m-1个板子,问有多少种取法。因为反正都是把球分为m个部分,所以不同的板子得到的效果是一样的,所以可以理解为是同一种取法。这就是组合。答案:
2、将n个相同的球放进m个不同的盒子里。球要放完,盒子可以为空,问有多少种放法。
解:假设盒子不可以为空,放在此题种就等价于你已经放了m个球,还有n个球。所以此题等价于有n+m个球,放在m个盒子里,球要放完,盒子不能为空,这就是第一题了。答案:
3.将n个不同的球放在m个相同的盒子里。要求每个盒子里球的数量一样,球要放完(数据保证m是n的因子),问有多少种方法。
解:设n/m=x,即每个盒子里要放x个球。放球时,第一步:在n个球中取出x个球放在一个空盒里,第二步又在剩下的n-x个球中取出x个球放在一个空盒里......直至放完。所以第一步的方法总数是:,到第二步的方法总数是:
,一共m步,以此类推。但是有这种情况:已经以某一种方案按要求将所有球放进m个盒子里了,现在却只是将A盒里的球放进B盒里,将B盒里原来的球放进A盒里。因为盒子是一样的,所以这是同一种方法。但计算时却以为是另一种方法。而这个等价于:已经以某一种方案按要求将所有球放进m个盒子里了,现在却只是将盒子调换位置,却认为是不同的方法。调换位置的方法有
个。所以最后还要减去
。答案:
三、求组合数
1、递归递推(详见上面的公式)
2、杨辉三角
组合数是和杨辉三角上的数一一对应的,只用处理细节。
附代码:
for(i = 0;i <= 1000;i++){ //根据题目要求确定大小
c[i][0] = c[i][i] = 1;
for(j = 1;j < i;j++)
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; //此处可根据题目要求取模
}
3、在n确定的情况下快速求C(n,m)
这个没什么技术含量,用小学数学推导。
即已知C(n,m),求C(n,m + 1)
ans = n; // C(n,1) = n;
for(i = 2;i <= m;i++)
ans = ans * (n - i + 1) / i; // C(n,i) = ans;