求组合数算法!!!
#define ll long long int
ll cnm(ll n,ll m)
{
if(m>n/2)
m=n-m;
ll a=1,b=1;
for(int i=1;i<=m;i++)
{
a*=n+1-i;
b*=i;
if(a%b==0)
{
a/=b;
b=1;
}
}
return a/b;
}
注意点:
1.其中 long long int 是为了防止结果过大。
2.设置一个判断m是否大于n/2,如过大于的话另m=n-m,减小计算量。
3.猛的一看for循环里头的可能有点懵逼其实拿出草稿纸化简一下组合数的计算公式可以发现:
C(n,m)=n! / m! (n-m)!
=n(n-1)…(n-m)! / m! * (n-m)!
分子分母分别有m项需要计算,分子从1乘到m,分母从n乘到n-m+1