算法竞赛模板 计算组合数
先贴上一张组合数的基本公式吧,在这里我们暂且规定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)); }