ncr in c(组合)

时间:2013-02-09 11:51:59

标签: c++ c binomial-coefficients

我试图用dp计算c中的ncr(组合)。但它失败了,n = 70。有人可以帮忙吗?

unsigned long long ncr( int n , int r)
{
unsigned long long c[1001];
int i=1; 
c[0]=1;
for(i=1; i<=r; i++)
    c[i]= ((unsigned long long) (c[i-1]) * (unsigned long long)( n-i+1))%(unsigned long long) (1000000007)/ (unsigned long long)(i);
return c[r];
}

基本思路是ncr =((n-r + 1)/ r)* nc(r-1)

2 个答案:

答案 0 :(得分:2)

中间产品(unsigned long long) (c[i-1]) * (unsigned long long)( n-i+1)是一个非常大的数字,并且溢出64位字。

您可能想要使用bignums。我强烈建议不要开发自己的bignum函数(例如bignums的乘法和除法),因为它是一个精巧的算法主题(你仍然可以获得博士学位)。

我建议使用一些现有的bignum库,例如GMP

某些语言或实现(特别是Common Lisp的SBCL)提供本机bignum操作。但标准的C或C ++不是。

答案 1 :(得分:-1)

在乘法之前进行除法。 a * b / c =(a / c)* b其中第二个更好的溢出似乎是你的问题。