算法竞赛模板 计算组合数

先贴上一张组合数的基本公式吧,在这里我们暂且规定n为下标,m为上标(n≥m)

①普通方法计算组合数

int com(int n,int m)
{
    int s=1;
    for(int i=1;i<=m;i++)
        s=s*(n+1-i)/i;
    return s;
}

②运用对数函数计算组合数(可以用于处理较大的数值)

(1) 在c语言中,log函数也就是我们通常所说的ln函数,即以e为底的对数函数

(2) s1作为分子,从m+1累乘至n;s2作为分母,从1累乘至n-m;

(3) 最后再用exp函数把经过处理的组合数还原出来

double lncom(int n,int m)
{
    double s1=0,s2=0,i;
    if(m<n/2.0)
        m=n-m;
    for(i=m+1;i<=n;i++)
        s1=s1+log(i);
    for(i=2;i<=n-m;i++)
        s2=s2+log(i);
    return s1-s2;             
}
double com(int n,int m)
{
    if(n<m)
        return 0;
    return exp(lncom(n,m));
}
posted @ 2018-02-02 17:14  真想不出名字了  阅读(344)  评论(1编辑  收藏  举报