【发布时间】:2016-12-13 10:23:49
【问题描述】:
这是我在一些在线评委平台上一直在做的一个问题。
求从 1 到 N 的数的最大因子和。
例如,如果 N 为 11,则答案将为 18。从 1 到 11 的因子之和最大的数字是 10 (1 + 2 + 5 + 10)。
我实现了一个看起来像筛子的相对简单的解决方案。 C++中的代码如下所示:
for (int i = 1; i <= 1000000; ++i {
for (int j = i; j <= 1000000; j += i) {
num[j] += i;
}
mx[i] = max(num[i], mx[i - 1]);
}
每当用户查询某个 N 时,我都会简单地输出 mx[N]。这个解决方案似乎是正确的。但是,对于较大的输入,它超过了时间限制(1s)。最大 N 为 1,000,000,但用户可以查询 1,000,000 个不同的 N 值。以上代码是运行一次的预处理代码。
上面代码的复杂度是N + N / 2 + N / 3 + ... + 1,我猜大概是N Log N。如何提高这段代码的复杂度?
感谢您的帮助。
【问题讨论】:
-
考虑素数分解。
-
@AbdenaceurLichiheb 如果我要使用素数分解,那会不会太耗时?如果我错了,请纠正我,但使用素因数分解,我必须先找到一个数字的所有素因数,然后再计算因数之和。
-
这个问题对于堆栈溢出来说太模糊了。有无限数量的可能答案。请将您的问题集中在代码的特定方面。
-
@xaxxon 请允许我编辑我的问题。
-
@AbdenaceurLichiheb 很抱歉,这个问题是由私人在线法官处理的。
标签: c++ algorithm data-structures number-theory factorization