大约一个月前,我在一次编程挑战中遇到了这个问题,但是社论尚未发布,所以我在这里问。
有一个大小为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
答案 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
值,我们就可以计算出所需的值。