algorithm - O(1) 时间复杂度的以下 ncr 系列的总和

标签 algorithm math time-complexity combinatorics

有多个表单查询

Q(n,m) = (nC1*mC1) + (nC2*mC2) + (nC3*mC3) ... (nCk*mCk) where k=min(n,m)

如何在 O(1) 时间复杂度内找到 Q(n,m) 的值。

我尝试预先计算 ncr[N][N] 矩阵和 dp[N][N][N] 其中 dp[n][m][min(n,m)] = Q(n ,m).

此预计算需要 O(N^3) 时间,现在可以在 O(1) 时间内回答查询。但我正在寻找一种预计算不应花费更多 O(N^2) 时间的方法。

最佳答案

从 C(n,0)*C(m,0) 开始的解决方案看起来很简单

Q0(n,m) = C(n+m, m)

因此对于您的公式只需减去 1

Q(n,m) = C(n+m, m) - 1

例子:n=9, m=5

帕斯卡三角形的第 9 行和第 5 行的点积是

1   9     36    84    126   126  84  36  9  1
1   5     10    10    5     1
1 + 45 +  360 + 840 + 630 + 126                = 2002    = C(14,5)

可以从Q(n,1)开始用数学归纳法证明,但是表达式比较长。

我发现了这个命题的一个真正奇妙的证明,即这个边距太窄而无法容纳 © Fermat ;)

关于algorithm - O(1) 时间复杂度的以下 ncr 系列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53200474/

相关文章:

将 OMML 转换为 MathML 的算法或代码

javascript - 寻找最近的 90 度 Angular 点

function - 如果 x = sml 中的整数,如何编写计算 F(x) 的函数

algorithm - 并行算法分析中的“工作”,“跨度”和“时间”之间有什么区别?

c++ - 为什么我对数组中的图 block 进行评分的函数不起作用?

arrays - 查找数组中差异为 's' 的所有对

C# 数组子集获取

找到相距最远的点的算法——比 O(n^2) 更好?

c++ - vector 重新声明与循环操作中的插入-C++

algorithm - 输入的时间复杂度和大小