我试图用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)
答案 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其中第二个更好的溢出似乎是你的问题。