组合数与错排数求解方法探析
来源:互联网 发布:淘宝充值软件利润 编辑:程序博客网 时间:2024/05/22 09:02
组合数:
我们都知道组合数C(m,n)的含义是从m个物品中选n个物品的方法种数,其冠以的数学求解表达式为:
C(m,n)=m!/(n!*(m-n)!); 这个公式是显而易见的,并不难证明。
但是某些题目中利用阶乘求其组合数,会浪费很多的时间和空间,可能会出现TLE,WA。因此,我们不得不寻求一些技巧,更加快捷的求出组合数。
现将常用的球求组合数C(m,n)总结如下
1) int a[1000] a[0]=1; for(int i=1;i<=m;i++) for(int j=i;j>=1;j--) a[j]+=a[j-1]; 注意:此方法只有当两重循环完成时,a[n]才能表示C(m,n),中间值不能表示C(m,n). 此规律可有杨辉三角中的规律得来。 2)数组保存n! int a[max]; a[0]=1; for(int i=1;i<max;i++) a[i]=i*a[i-1]; 此时a[i]保存了i!,则C(m,n)=a[m]/a[n]/a[m-n].
- 错排数:
由容斥原理很容易得到错排公式为:
S[n]=n!(1-1/1!+1/2!-1/3!+1/4!……….(-1)^n*1/n!)
而且 错排数相邻两项递推S[n]=n*S[n-1]+(-1)^n;
值得注意的是
还有第二种递推式:
S[n]=(n-1)*(S[n-1]+S[n-2])
因此可以有两种打表方式:
a[0]=0;a[1]=0; for(int i=0;i<max;i++) a[i]=i*a[i-1]+(-1)^i
或:
for(int i=2;i<max;i++) a[i]=(i-1)*(a[i-1]+a[i-2]);
0 0
- 组合数与错排数求解方法探析
- 卡特兰数(组合方法求解)
- 组合数快速求解
- 组合数求解公式
- Lucas求解组合数模板
- hdu 2519 - 求解组合数
- 求解变态组合数C(n,m)的几种方法
- 变态组合数C(n,m)求解
- 求解钱的张数最少组合
- 递归的应用-组合数求解
- 一种求解组合数的思路
- 组合数处理(逆元求解)
- java 快速求解组合数 lacus算法
- 简单方法求解丑陋数
- 排列数与组合数
- 组合优化问题建模求解方法
- 素数与求解方法
- JOJ1595:Combinations(求解大组合数,Lucas定理)
- 深入理解javascript原型链
- leetcode 16 3Sum Closet
- 安卓控件使用系列24:Gallery画廊控件的使用方法
- HighCharts坐标轴Y轴倒过来画图
- java nio 高级
- 组合数与错排数求解方法探析
- HighCharts设置多个Y轴 Y轴位置
- 非静态成员引用必须与特定对象相对
- (lamphc0)配置服务器及服务器端的开发环境=>长期更新
- Java的类引用的思索
- java反射机制
- Gradle project sync failed. Please fix your project and try again
- MSM8974 fastboot烧写软件
- uva536(先序 + 中序输出后序)