一、组合数的定义
定义 从个元素中选出
个 (
),这
个元素叫做从
个元素中选出
个的一个组合;从
个元素中选出
个的组合的个数,叫做从
个元素中选出
组合数,记作个的
。
解:列举可得,共有
二、组合数的计算
上面给出了组合数的一个应用。但是,求组合数真的一定要用一一列举吗?显然,我们有更好的方法——
性质一 对于组合数,我们有:
. 其中,
称为
的阶乘,且
. 特别地,我们规定:
.
注:组合数公式是由排列数公式推导而来的,这里不再展开证明。
回到上面的问题,我们可以验证列举法是否正确。由于
三、组合数的一些神奇的性质——从杨辉三角谈起
![800dccac31b8281e6735dabffc082650.png](https://img-blog.csdnimg.cn/img_convert/800dccac31b8281e6735dabffc082650.png)
杨辉三角是中国传统数学智慧的结晶,在今天还有它的作用。
我们来考虑杨辉三角的性质:
不妨将上图中的杨辉三角移成一个直角三角形,如下图:
如果从
![04fc4643943727de00b3f0add4b3eb51.png](https://img-blog.csdnimg.cn/img_convert/04fc4643943727de00b3f0add4b3eb51.png)
I.
II.
有了这两条递推关系,我们便可以计算出杨辉三角中任意一个位置的值了。
可这和组合数有什么关系呢?
观察第
经过更多验证,我们可以得知,杨辉三角中第
结合上面的两条递推关系,我们可以推出组合数的两条重要性质:
性质二性质三![]()
![]()
(证明略去。。。显然易证(并不))
对性质三,我们可以直观地理解:在若干个小球中,如果一个都不选或者全选,那显然只有一种选择。
继续观察这个三角形,还能发现组合数的“对称性”:
性质四![]()
对性质四,我们又可以这样理解:在装有
再观察杨辉三角的每一行,我们尝试着求出每一行的和,又能发现两个性质:
性质五性质六![]()
![]()
最后,我们再来观察这样一组式子:
......
发现规律了吗?
对于
定理![]()
这个定理,我们称为二项式定理.
不难得到,
四、关于组合数学的一些趣题
1. 洛谷P1313 计算系数(2011年NOIP提高组D2T1)
P1313 计算系数 - 洛谷www.luogu.org题目描述:
给定一个多项式
输入格式:
共一行,包含
输出格式:
共一行,包含
解:很显然,这题用二项式定理可以秒杀。
根据二项式定理可知,
与二项式定理对比通项可知:
如何快速地求出答案呢?
对于答案所需的两个幂运算,我们不难想到,使用快速幂即可(时间复杂度
本题代码如下:
#include <cstdio>
#define MOD (10007)
#define int long long //很骚的宏定义
using namespace std;
int a,b,k,n,m,c[1001][1001];
int power(int a,int b){ //分治法求快速幂
if(b==1) return a%MOD;
if(b==0) return 1;
int t=power(a,b/2)%MOD;
if(b%2) return ((t*t)%MOD*a%MOD)%MOD;
else return (t*t)%MOD;
}
void getC(){ //递推求解C[n][m]
for(int i=0;i<=1000;i++){
c[i][0]=1; //初始条件
c[i][i]=1;
}
for(int i=2;i<=1000;i++)
for(int j=1;j<=1000;j++)
c[i][j]=(c[i-1][j]+c[i-1][j-1])%10007; //性质三,注意取模
}
signed main(){
scanf("%lld %lld %lld %lld %lld",&a,&b,&k,&n,&m);
getC();
printf("%lld",(c[k][k-n]*((power(a,n)%MOD)*(power(b,k-n)%MOD))%MOD)%MOD);
return 0;
}
2. 持续更新中……