【问题标题】:Subsequence sum and GCD子序列和和GCD
【发布时间】:2018-08-24 19:45:33
【问题描述】:

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

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

例子:

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

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

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

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

答案 => 3 + 4 + 5 = 12

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这对我来说似乎很明显。但是这个答案不符合约束条件。只有 N*K 可以是 900,000,000,d 至少在大部分迭代中可以是十位数,更不用说构建和维护该哈希的额外时间了。
    • @גלעדברקן 嗨。您如何看待这个问题可能只是关于 k 个连续元素?
    • @m69 我不知道,但这就是重复的stackoverflow.com/questions/51684555/…中讨论的内容@
    • @גלעדברקן 我们也在这里讨论过 :-) 我还是不确定。
    • @m69 在这种情况下,我们至少可以有一个 O(sqrt(range) * N) 解决方案,它会低于 10,000,000。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多