如何找到固定 n 的前 r 二项式系数的总和?

Posted

技术标签:

【中文标题】如何找到固定 n 的前 r 二项式系数的总和?【英文标题】:How to find a sum of the first r binomial coefficients for fixed n? 【发布时间】:2016-10-08 11:39:48 【问题描述】:

我已经尝试了解决这个系列的基本方法,但是nr 的较大值需要时间。有没有办法在一个时间复杂度不依赖于n OR r.Range r,n 的单个表达式中减少这个表达式

注意:这里是r < n,即我必须找到这个系列的第一个r+1 术语的总和。


我已经阅读了这个问题,但它对我没有帮助:

Algorithm to find Sum of the first r binomial coefficients for fixed n modulo m

【问题讨论】:

“n & r 的较大值”是什么意思。你想在哪个范围内选择n和r? 你现在如何计算nCr的值? r 和 n 有什么限制?我们可以假设 r 相对较小吗? 这个模数是什么?否则,对于“nr 的较大值”,您将溢出整数。 关于“已经尝试过基本方法......”:您应该发布代码的重要部分,并说明需要多少时间。这是为了让人们知道这种“基本方式”是什么,所以他们不会发布建议它的答案。也很高兴知道您的时间太多了。 【参考方案1】:

AFAIK,没有这样的表达可以简化。但它可以在 O(r) 时间复杂度内完成,如下所示。

考虑一个数组 A,其中 A[i] 存储 nci。然后我们可以很容易地验证 A[i] = A[i-1].(n-i+1)/(i)

所以

A[0] = 1;
for(int i=1;i<=r;i++)
    A[i] = A[i-1].(n-i+1)/(i);

int ans = 0; //The required answer
for(int i=0;i<=r;i++)
    ans = ans+A[i];

【讨论】:

我想补充一点,如果n/2 &lt;&lt; r &lt; n 那么你可以通过从r to n 中减去总和并从2^n 中减去它来节省一些计算时间,这是 整行行 我必须用模 m 来计算它。我试过了,但结果错误。这是我的代码,以防您发现任何错误Arr[0] = 1; for(i=1;i&lt;=max;i++) Arr[i] = ((Arr[i-1]*(range-i+1))/i)%MOD; for(i=0;i&lt;=max;i++) sum += Arr[i]; sum%=MOD; 不,这不起作用。 (a.b)%m = ((a%m).(b%m))%m 是真的,但不能保证 ( a.(b/c) )%m = ((a%m).( (b/c) %m))%m。正如this 链接中所述,在为所有i&lt;=n 存储i! % m 后,您可以非常快地找到ncrmodm。如果您不理解该解决方案,请在下面发表评论,我将编辑我的答案并发布详细的解决方案。我假设m is prime.【参考方案2】:

对于较大的 N,二项式系数的行为类似于高斯曲线(至少对于最中心的值)。这可以从斯特林公式推导出来,并得到中心极限定理的支持。

那么部分和就可以用Error函数来近似了。

【讨论】:

以上是关于如何找到固定 n 的前 r 二项式系数的总和?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 O(n) 中前 k 个二项式系数的总和而不会溢出?

计算具有大二项式系数的总和

在 R 中计算 *integer* 二项式系数

每日一小练——二项式系数加法解

使用pascals三角形打印二项式系数

多项式的系数怎么求