algorithm - 序列和与 GCD

标签 algorithm subset combinations dynamic-programming greatest-common-divisor

大约一个月前,我在一次编程挑战中遇到了这个问题,但社论尚未发布,所以我在这里提出这个问题。

有一个大小为 N 的数组 A。求 A 的 K 个长度子序列的总和 * GCD。

示例:

If A = [1, 2, 3] and K = 2,

{1, 2} = 3(sum) * 1(GCD) = 3

{1, 3} = 4(sum) * 1(GCD) = 4

{2, 3} = 5(sum) * 1(GCD) = 5

Ans => 3 + 4 + 5 = 12

Problem description

最佳答案

这是从头开始的(虽然没有彻底测试):

C[k, i, d]A[1..i] 的所有 k 长度子序列的数量这样它们的 GCD 就等于 d

然后

C[k, i, d] = Sum(C[k - 1, i - 1, d']) + C[k, i - 1, d]

其中对所有 d' 进行求和,使得 gcd(A[i], d') = d

第一项(总和)对应于我们从 A[1..i-1] 中获取所有序列并附加 A[i] 的情况给他们。最后一项 - 当我们不包含 A[i] 时。

S[k, i, d]A[1..i] 的所有 k 长度子序列的总和> 这样它们的 GCD 就等于 d

然后

S[k, i, d] = Sum(C[k - 1, i - 1, d'] * A[i] + S[k - 1, i - 1, d']) + S[k, i - 1, d]

其中对所有 d' 求和,使得 gcd(A[i], d') = d

然后有了 S[k, i, d] 并知道所有可能的 d 值,我们就可以计算所需的值。

关于algorithm - 序列和与 GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52010836/

相关文章:

objective-c - 返回所有其所有数字都不在任何其他集合中的集合

regex - 数字范围的正则表达式生成器

java - 查找给定邻接矩阵中有多少个相连的节点组

r - 用另一个向量子集化一个向量

javascript - 用一组重量平衡秤

algorithm - 具有连续(非不同)约束的背包

java - 使用 Gosper's Hack(银行家序列)生成所有子集

java - 如何在java中快速有效地从列表中创建子集或powerSet?

arrays - 如何在postgresql中找到任意大小数组的所有组合(子集)

algorithm - 如何找到多重集的所有分区(允许重复的集合)