求组合数的方法:转载自VincentCZW的博客

遇到了就查了下:地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/18/2508189.html

求一个组合数Cnm的值,Cnm= n! /(n-m)!*m!化简的结果为

Cnm = (n*(n-1)*…*(n-m+1))/m!

这个直接求根据公式直接求显然是不行的,当n和m较大时,显然是要溢出的。目前知道两种解决这种题的思路:

思路一:可以利用递推关系式Cnm = C(n)(m-1) + C(n-1)(m-1)来实现,这样初始化前几个组合数,在根据题目要求处理的最大n和m值,递推求出所有的Cnm,并保存。

实现方法以后补上。

思路二:为了避免直接计算n的阶乘,可以直接对公式两边取对数,于是得到:ln(C(n,m)) = ln(n!) - ln(m!) - ln( (n-m)! )

对数有性质:ln(x*y) = ln(x) + ln(y),因此转化成:

Ln(n!) = ln(1) + ln(2) + …+ln(n);

同理消去重叠的部分得到:

Cnm = (n*(n-1)*…*(n-m+1))/m!

因此这个算法时间复杂度仍然是 O( m ),虽然浮点计算比整数计算要慢,但解决了整数计算的溢出问题。

代码实现(转)

double cnm_lg(int n,int m)

{

  int i;

  double s1=0.0,s2=0.0;

  for(i=1;i<=m;i++)

    s1 += log(i);

  for(i=n-m+1;i<=n;i++)

    s2 += log(i);

  return s2-s1;

}

double cnm_double(int n,int m)

{

  if(m > n/2)

  m = n-m;

  return exp(cnm_lg(n,m));

}

时间: 2024-12-30 00:07:19

求组合数的方法:转载自VincentCZW的博客的相关文章

HTML中META属性详解 转载自 hero_213的博客

HTML中META属性详解 meta是html语言head区的一个辅助性标签.几乎所有的网页里,我们可以看到类似下面这段的html代码: <head> <meta   http-equiv= "content-Type "   content= "text/html;   charset=gb2312 "> </head>         也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,例如加

【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

[转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics凭借其强大的功能和超强的稳定性.快速的反应能力.广泛的数据应用功能,受到了广大站长的追捧. 使用Google Analytics的站长们应该不在少数吧,每天登录Google Analytics免费网站上查看网站的流量也是我们这些站长们必须做的事情,认真分析Google Analytics当中的数据信

为什么原创博客被认为是转载?对51cto博客有点小失望

寒假时候,打算从博客园转移到51cto博客,于是满心欢喜的把几篇博客转接到这边来,以后打算长此在这边发表博文.可是今天发现了"原创博客文章被判为转载"扣除了四次.那么我有几个问题 1.为何我的原创文章只有3篇,会被扣除4次? 2.为何原创文章被判定为转载,我在其他博客上面发表的,不能拿到这边来吗. 3.被判定为转载的文章, 十二生肖查询网页版制作(php) 今天无聊做了一个十二生肖查询器: 预览网址效果:http://hongxing01.hktd02u.me48.com/03Sxcx

【转载】怎么设置博客背景

写在前面 鉴于平常逛其他大神的blog的时候,经常看见他们blog上好看的背景.但自己又不知道怎么弄的,觉得很神奇.直接度娘试了前几篇发现没用.于是对着别人blog的网页源代码捣腾了一个下午,发现了摸索出了一些奥妙重重的东西,于是就挂到自己blog上给大家分享一下,如侵删. 第一步.将所需要的图片上传至博客园的服务器上 具体的方法有很多种,以下列举几种: 发表一篇blog(随笔),在blog里面传上你想要的背景图片.然后打开那篇blog,开审查元素或对着图片点复制图片地址. 直接讲图片传至相册上

MD5算法在PB中的实现(转载自 - 阿多米 - 博客园)

注:转载请写明出处.本文转载自--阿多米,原链接:http://www.cnblogs.com/zzjder/archive/2008/10/23/1317505.html 目的是防止原链接失效,好文章要保存起来. MD5算法自从1991开发出来以后广泛用于数字签名和加密解密领域.目前使用PB外的语言可以较为简单地实现了MD5加密,使用PB来实现的比较鲜见,这可能有如下两方面的原因:一,PB在位运算方面未提供直接使用的函数,要实现位运算比较麻烦:二,在PB(PB10之前的版本)中无法直接获取字符

Path.OS 模块的使用方法(转自DK的博客)

Python os.path模块 使用方法 os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径. os.path.dirname(path) #返回文件路径 os.path.exists(path)  #路径存在则返回True,路径损坏返回False os.path.lexists  #路径存在则返回True,路径损

WinForm 分辨率自适应--转载自博雅居博客

我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可.因为窗体上控件的位置和大小是相对于自己所在的窗体的,也就是所谓的窗口坐标. 在这里我们只考虑相对于自己窗体的窗口坐标更简单,也就是成比例变化.为了多个窗体共用,我在这里创建一个类AutoSizeFormClass ,1.使用它去记录窗体和其控件的初始位置和大小,2.判断窗体中的控件是否为容器控件,如果

13、基因组的拼接原理(转载沈梦圆的博客)

最近学习了一下基因组的拼接原理,以下是我的学习笔记和一些思考.基因组的拼接原理是高通量测序技术的基础知识吧,我个人认为即使不做基 因组拼接工作,也可以学习一下几个主流拼接软件的算法和原理.我主要是学习了两个网上教程,其教程出处为https://github.com/ TGAC/361Division/tree/master/de_novo_2016和https://github.com/ lexnederbragt/INF-BIO9120_fall2013_de_novo_assembly/tr

HASH方法课下补分博客

课堂要求:利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75)关键字集合:85,75,57,60,65,(你的8位学号相加值),98,74,89,12,5,46,97,13,69,52,92.完成计算并提交计算过程. 实践要点:通过课上对hash方法以及散列函数的学习,了解散列冲突的机制,并学习解决散列冲突的方法.主要学习和实践的方法是开放地址法和拉链法,首先需要理解这两种方法的实现过程,然后运用到实际的题目中去解决