Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c类不合格报告(组合)_C++_C_Binomial Coefficients - Fatal编程技术网

C++ c类不合格报告(组合)

C++ c类不合格报告(组合),c++,c,binomial-coefficients,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) (1000000

我试图用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)
{
无符号长c[1001];
int i=1;
c[0]=1;

对于(i=1;i而言,中间产物
(无符号长-长)(c[i-1])*(无符号长-长)(n-i+1)
是一个非常大的数字,并且溢出了64位字

我强烈建议你不要开发自己的bignum函数(例如bignum的乘法和除法),因为它是一门微妙的算法学科(你仍然可以获得这方面的博士学位)

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


一些语言或实现(特别是对于普通LISP)提供本地的BigNIM操作。但是标准C或C++没有。

< P>在乘法之前进行划分。
a*b/c=(a/c)*b第二个更好,因为溢出似乎是你的问题。

很抱歉,我在实际代码中使用了以下内容(采用ans的mod):c[i]=((无符号长时间)(c[i-1])*(无符号长时间)(n-i+1))%(无符号长时间)(100000007)/(无符号长时间)(i);但你仍然需要计算c(n,p)在bignums中,然后取
100000007
的模,这是一个大素数(因此需要所有数字或C(n,p)位才能得到模)。在你的情况下,你真的无法避免bignums…@bhavneet要计算
nCr%p
,你不能除以
i
,你必须与其模逆相乘。此外,如果你的意思是c[i]=((无符号长)(c[i-1])/(无符号长)(i))*(无符号长)(n-i+1))%(无符号长)(100000007);它仍然不起作用我没有调试它,你仍然需要用rec使它更好,在我看来可读性更好。它是否传递值n>=71?最终结果是一个整数,这并不意味着按照特定顺序构建它的每个中间因子都是一个整数。对于
(a*b)/c
可能不同于
(a/c)*b
(3*2)/2==3
,这与
(3/2)*2==2
不同。