aiaiask.com©

开花即结果 提问即答案

小美欲删数组 k 元素,使剩余元素两两互为倍数,求删除方案数(对 10^9 + 7 取模)
原始问题:

小美欲删数组 k 元素,使剩余元素两两互为倍数,求删除方案数(对 10^9 + 7 取模)

这个问题可以使用动态规划来解决。首先,我们可以将数组a按照从小到大的顺序排序。然后,我们定义一个dp数组,dp[i]表示以a[i]为最大值的子序列中,满足两两之间互为倍数关系的删除方案数。

我们可以从左到右遍历数组a,对于每个a[i],我们需要找到在a[0]到a[i-1]中,能够与a[i]互为倍数关系的元素a[j]。如果找到了这样的元素,那么dp[i]就等于dp[j],因为我们可以将a[i]添加到以a[j]为最大值的子序列中,得到以a[i]为最大值的子序列,删除方案数不变。如果没有找到这样的元素,那么dp[i]就等于1,因为我们可以将a[i]作为一个新的子序列。

最后,我们将dp数组中的所有元素相加,得到的结果就是满足条件的删除方案数。由于答案可能很大,我们需要对结果取模。

下面是使用Python实现的代码:

MOD = 10**9 + 7

def count_delete_plans(k, a):
    n = len(a)
    a.sort()
    dp = [0] * n
    dp[0] = 1

    for i in range(1, n):
        dp[i] = 1
        for j in range(i-1, -1, -1):
            if a[i] % a[j] == 0:
                dp[i] = (dp[i] + dp[j]) % MOD

    return sum(dp) % MOD

k = int(input())
a = list(map(int, input().split()))
print(count_delete_plans(k, a))

对于示例输入,输出结果为8。

小美欲删数组 k 元素,使剩余元素两两互为倍数,求删除方案数(对 10^9 + 7 取模)
https://www.aiaiask.com/ask/45779.html
AI / 模型Siliconflow
时间 / DATESeptember 2, 2023, 8:27 PM
语言zh-CN
IP / 区域北京市北京市