给定:集合A = {a0, a1, ..., aN-1}
(1 ≤ N ≤ 100
),其中 2 ≤ ai ≤ 500
。
问题:找出所有大小至少为2的A
子集的最小公倍数(LCM)之和。
对于一个集合B = {b0, b1, ..., bk-1}
,它的最小公倍数LCM定义为最小整数Bmin
,使得对于所有0 ≤ i < k
,都有bi | Bmin
。
例子:
假设N = 3
且A = {2, 6, 7}
,则:
LCM({2, 6}) = 6
LCM({2, 7}) = 14
LCM({6, 7}) = 42
LCM({2, 6, 7}) = 42
----------------------- +
answer 104
天真的方法是对所有 O(2N)
子集计算最小公倍数,这对于相当大的 N
是不可行的。
解决方案草图:
这个问题来自一个比赛*,比赛提供了解决方案草图。这就是我的问题所在:我不理解暗示的方法。
解决方案如下(除了一些固定的语法问题):
解决方案有点棘手。如果我们仔细观察,我们会发现整数介于
2
和500
之间。因此,如果我们对数字进行质因数分解,我们得到以下最大幂次:
2 8
3 5
5 3
7 3
11 2
13 2
17 2
19 2
除此之外,所有的质数次幂均为1。因此,我们可以使用这些整数轻松计算出所有可能的状态,留下9 * 6 * 4 * 4 * 3 * 3 * 3 * 3个状态,约为70000个。对于其他整数,我们可以创建类似以下内容的 dp:
dp[70000][i]
,其中i
可以是0到100。然而,由于dp[i]
依赖于dp[i-1]
,所以dp[70000][2]
就足够了。这将复杂度降至n * 70000
,是可行的。我有以下具体问题:
- 这些状态是什么意思?
dp
是否代表动态规划,如果是,正在解决什么递归关系?- 如何从
dp[i-1]
计算出dp[i]
? - 为什么大质数不会对状态数量产生贡献?每个大质数只出现
0
或1
次。这些质数的状态数量不应该乘以2
(导致状态空间不可行)吗?
*原问题描述可以在 this source (problem F) 中找到。此问题是该描述的简化版本。