子序列和与GCD

时间:2018-08-24 19:45:34

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

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

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

示例:

  

如果A = [1、2、3]并且K = 2,

     

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

     

{1,3} = 4(总和)* 1(GCD)= 4

     

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

     

Ans => 3 + 4 + 5 = 12

Problem description

1 个答案:

答案 0 :(得分:2)

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

C[k, i, d]k的所有A[1..i]长度子序列的数目,以使它们的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]k的所有A[1..i]长度子序列的总和,以使它们的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值,我们就可以计算出所需的值。