数学板块学习之组合数

博客主要介绍了组合数,包括其表示形式、计算公式、求和公式、常见公式等内容,还提及了递推法代码,指出其复杂度高达O(n²),并提到可在O(n)时间内求阶乘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合数

CnmC_{n}^{m}Cnm也写做(nm)\tbinom{n}{m}(mn),其实(nm)\tbinom{n}{m}(mn)比较正宗,但是习惯上还是喜欢CnmC_{n}^{m}Cnm

Cnm=n!m!(n−m!)C_{n}^{m}=\frac{n!}{m!(n-m!)}Cnm=m!(nm!)n!
求和公式(k=1.2.⋯nk=1.2.\cdots nk=1.2.n):
S(k)=n(n+1)2S(k)=\cfrac{n(n+1)}{2}S(k)=2n(n+1)
S(2k−1)=n2S(2k-1)=n^2S(2k1)=n2
S(k2)=n(n+1)(2n+1)6S(k^2)=\cfrac{n(n+1)(2n+1)}{6}S(k2)=6n(n+1)(2n+1)
S((2k−1)2)=n(4n2−1)3S((2k-1)^2)=\cfrac{n(4n^2-1)}{3}S((2k1)2)=3n(4n21)
S(k3)=n2(2n2−1)S(k^3)=n^2(2n^2-1)S(k3)=n2(2n21)
S((2k−1)3)=n2(2n2−1)S((2k-1)^3)=n^2(2n^2-1)S((2k1)3)=n2(2n21)
S(k4)=n(n+1)(2n+1)(3n2+3n−1)30S(k^4)=\cfrac{n(n+1)(2n+1)(3n^2+3n-1)}{30}S(k4)=30n(n+1)(2n+1)(3n2+3n1)
S(k5)=n2(n+1)2(2n2+2n−1)12S( k^5 ) = \cfrac{n^2(n+1)^2(2n^2+2n-1)}{12}S(k5)=12n2(n+1)2(2n2+2n1)
S(k(k+1))=n(n+1)(n+2)3S( k(k+1) ) = \cfrac{n(n+1)(n+2)}{3}S(k(k+1))=3n(n+1)(n+2)
S(k(k+1)(k+2))=n(n+1)(n+2)(n+3)4S( k(k+1)(k+2) ) = \cfrac{n(n+1)(n+2)(n+3)}{4}S(k(k+1)(k+2))=4n(n+1)(n+2)(n+3)
S(k(k+1)(k+2)(k+3))=n(n+1)(n+2)(n+3)(n+4)5S( k(k+1)(k+2)(k+3) ) = \cfrac{n(n+1)(n+2)(n+3)(n+4)}{5}S(k(k+1)(k+2)(k+3))=5n(n+1)(n+2)(n+3)(n+4)

常见公式:
Cmn=Cmm−nC_{m}^{n}=C_{m}^{m-n}Cmn=Cmmn

CmnCnr=CmrCm−rn−rC_{m}^{n}C_{n}^{r}=C_{m}^{r}C_{m-r}^{n-r}CmnCnr=CmrCmrnr

Cmn=Cm−1n+Cm−1n−1C_{m}^{n}=C_{m-1}^{n}+C_{m-1}^{n-1}Cmn=Cm1n+Cm1n1

Cm0−Cm1+Cm2−⋯ ± Cmm=0C_{m}^{0}-C_{m}^{1}+C_{m}^{2}-\cdots\ \pm\ C_{m}^{m}=0Cm0Cm1+Cm2 ± Cmm=0

∑i=0mCmixi=(x+1)m\sum_{i=0}^{m}C_{m}^{i}x_i=(x+1)^mi=0mCmixi=(x+1)m

Cm+r+1r=∑i=0rCm+iiC_{m+r+1}^{r}=\sum_{i=0}^{r}C_{m+i}^{i}Cm+r+1r=i=0rCm+ii

∑i=0mCmi=2m\sum_{i=0}^{m}C_{m}^{i}=2^mi=0mCmi=2m

递推法代码

int comb[maxn][maxn];
const int MOD = 1e9+7;
int main(){
    for(int i = 0; i < maxn; ++i){
        comb[i][0] = comb[i][i] = 1;
        for(int j = 1; j < i; ++j){
            comb[i][j] = comb[i-1][j] + comb[i-1][j-1];
            comb[i][j] %= MOD;
        }
    }
}

但是明显复杂度高达O(n2)O(n^{2})O(n2)

O(n)O(n)O(n)时间内求阶乘

typedef long long ll;
const int maxn = 50000;
const double INF = 0x3f3f3f3f;
const int MOD = 1e9+7;


ll F[maxn],Finv[maxn],inv[maxn];//F是阶乘,Finv是逆元的阶乘 
void init(){
    inv[1] = 1;
    for(ll i = 2; i < maxn; ++i){
        inv[i] = (MOD-MOD/i)*inv[MOD%i]%MOD;
    }
    F[0] = Finv[0] = 1;
    for(ll i = 1; i < maxn; ++i){
        F[i] = F[i-1]*i%MOD;
        Finv[i] = Finv[i-1]*inv[i]%MOD;
    }
}
ll comb(int n,int m){//C[n][m]
    if(m < 0 || m > n) return 0;
    return F[n]*Finv[n-m]%MOD*Finv[m]%MOD;
}
int main(){
    init();
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值