在给定范围内数字的最大值

Maximum Sum of Factors of Numbers in a given Range

本文关键字:最大值 数字 范围内      更新时间:2023-10-16

这是我在某个在线法官平台上一直在做的问题。

找到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时,i Simpy输出mx[N]。该解决方案似乎是正确的。但是,对于较大的输入,它超过了时间限制(1s)。最大n是1,000,000,但用户可以查询1,000,000个不同值的N。上面的代码是一次已运行的预处理代码。

上述代码的复杂性是n n/2 n/3 ... 1,我想是n log n。我如何改善此代码的复杂性?

谢谢您的帮助。

这个问题的答案是:高度丰富的数字
您可以从这里获得序列:A002093

实际上,我检查了10^10以下的所有高度丰富的数字is 41平移数字,低于10^13的数字为61平移数字。
n-smooth数字可以将低于n的素数分解。
您可以像此算法一样搜索N-Smooth号码(Ex。47平滑的号码在10^16):

vector<int> p = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 };
vector<long long> s = { 1 }; long long lim = 10000000000000000;
for (int i = 0; i < p.size(); i++) {
    vector<long long> w;
    for (long long j : s) {
        long long mul = j;
        for (; mul <= lim; mul *= p[i]) w.push_back(mul);
    }
    s = w;
}

您可以在O(log N + log X)中分解N-Smooth Number X,因此您可以计算O(log N + log X)的除数函数。

例如,我给出代码的结果,例如,使用1GB的内存。