组合数

long long factorial(int n)
{
    long long m = 1;
    for(int i=1;i<=n;i++)
        m*=i;
        return m;
}
long long C(int n,int m)
{
    return factorial(n)/(factorial(m)*factorial(n-m));
    //可能会溢出
}

正解:

long long C(int n,int m)
{
    if(m<n-m) m = n-m;
    long long ans = 1;
    for(int i=m+1;i<=n;i++) ans *= i;
    for(int i=1;i<=n-m;i++) ans /= i;
    return ans;
}

others:

long long C(int n,int m)
{
    long long ans = 1;
    for(int i=1;i<=m;i++)
        ans = ans * (n-i+1)/i;
    return ans;
}
原文地址:https://www.cnblogs.com/qie-wei/p/10160150.html