组合数

1. n! 有多少个质因子 p ?

答案是

// 计算 n! 中有多少个质因子 p,复杂度为 O(longn)
int cal(int n, int p){
    int ans=0;
    while(n){
        ans+=n/p;
        n/p;
    }
    return ans;
}

2. 组合数的计算

2.1. 方法一:组合数递推公式

,即 n 个不同的数中选 m 个数的方案数,等于不选第一个数,在剩下的数中选 m 个,加上选第一个数,再从剩下的数中选 m-1 个。

int C(int n, int m){
    if(m==0 || n==m) return 1;
    return C(n-1,m)+C(n-1,m-1);
}
// 记录算过的数
int C(int n, int m){
    int res[N][N]={0};
    if(m==0 || n==m) return 1;
    return res[n][m]=C(n-1,m)+C(n-1,m-1);
}

2.2. 方法二:组合数定义式变形

第 i 层的结果为 为整数。

// 时间复杂度为 O(m)
int C(int n, int m){
    int ans=1;
    for(int i=1;i<=m;i++){
        ans=ans*(n-m+i)/i;
    }
    return ans;
}

3. ChangeLog

2018.09.04 初稿

results matching ""

    No results matching ""