【发布时间】:2014-08-07 04:58:10
【问题描述】:
我想找到满足某个条件 C(m) 的最大值 m = a*b,其中
1 <= a <= b <= 1,000,000.
为了做到这一点,我想以 a*b 的降序迭代所有 a,b 对。
例如,对于最大为 5 的值,顺序为:
5 x 5 = 25
4 x 5 = 20
4 x 4 = 16
3 x 5 = 15
3 x 4 = 12
2 x 5 = 10
3 x 3 = 9
2 x 4 = 8
2 x 3 = 6
1 x 5 = 5
1 x 4 = 4
2 x 2 = 4
1 x 3 = 3
1 x 2 = 2
1 x 1 = 1
到目前为止,我已经提出了一个类似 BFS 的树搜索,我从当前的“访问过”集合中生成候选者并选择最高值的候选者,但它是一团糟,我不确定正确性.我想知道我是否缺少某种技巧。
我也对任何单调函数 f(a,b) 排序的更一般情况感兴趣,如果存在这样的事情的话。
为了说明,C(m) 可能是“如果 m2+m+41 是素数则返回 true,否则返回 false”,但我真的在寻找一种通用的方法。
【问题讨论】:
-
条件C(m)是什么? (为什么你的列表中漏掉了 7 的倍数)?
-
@user1990169 因为 7 大于 5,这不是“最多 5”吗?只是猜测。
-
我不明白。你说属性 C 只取决于数字 m (而不是它是如何分解的)。然后你应该搜索可能的 m 测试 C。搜索因式分解是浪费的,更不用说复杂了。您断言 m 可以写成小数的乘积只是另一个要测试的条件 D。
-
@ColonelPanic 我非常同意。这就是nmore答案背后的想法。我希望有一个数学技巧可以在不使用堆的情况下解决 ab 的特定情况。无论如何,如果条件 D 足够稀疏,使用堆可能仍然更快,例如如果我使用 a^3*b^3 而不是 ab.