【发布时间】:2014-12-15 07:03:03
【问题描述】:
给定: 设置A = {a<sub>0</sub>, a<sub>1</sub>, ..., a<sub>N-1</sub>} (1 &leq; N &leq; 100) 和2 &leq; a<sub>i</sub> &leq; 500。
问:求A 大小至少为 2 的所有子集的所有最小公倍数 (LCM) 之和。
集合B = {b<sub>0</sub>, b<sub>1</sub>, ..., b<sub>k-1</sub>} 的 LCM 定义为最小整数 B<sub>min</sub> 使得 b<sub>i</sub> | B<sub>min</sub>,对于所有 0 &leq; i < k。
示例:
让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(2<sup>N</sup>) 子集的 LCM,这对于相当大的 N 是不可行的。
解决方案草图:
问题来自一个竞赛*,该竞赛还提供了solution sketch。这就是我的问题所在:我不明白暗示的方法。
解决方案如下(以一些小的固定语法问题为模):
解决方案有点棘手。如果我们仔细观察,我们会发现整数介于
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]是如何从dp[i-1]计算出来的? - 为什么大素数对状态数没有贡献?它们中的每一个都出现
0或1次。对于这些素数中的每一个,状态数是否不应该乘以2(再次导致不可行的状态空间)?
*原问题描述可参考this source(问题F)。这个问题是该描述的简化版本。
【问题讨论】:
-
@PhamTrung "state" 是什么意思,dp[state][i] 是什么意思,以及如何翻译 dp[f(state)][i] = g( dp[state][i -1])
-
@MasterMind 我对这个问题感到沮丧,因为自从我读到你的问题后,它就一直萦绕在我的脑海中:) 我试图重新表述这个问题,以便(希望)吸引更多答案。我想我尽可能接近您最初问题的核心,但请您验证一下吗?
-
@VincentvanderWeele 非常感谢,你真的完全理解我。您所做的修改令人惊叹,您提出的问题是核心和问题的核心。再来一次,谢谢
-
Stack Overflow 不是一个要求人们做功课的网站...
标签: algorithm computer-science dynamic-programming primes prime-factoring