在给定范围内数字的最大值
Maximum Sum of Factors of Numbers in a given Range
这是我在某个在线法官平台上一直在做的问题。
找到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的内存。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- C++程序来查找输入数字的最小/最大值
- 如何返回一串字母数字字符中的最大值(例如-1A003B3)?
- 从 3 个数字中选择最大值和最小值,C++
- 在给定范围内数字的最大值
- N个数字中M个数字的最大值
- 程序编译并执行,但输出的不合理大的数字作为最大值.如何显示长双倍?
- rand()不起作用,给了我一个超出指定的最大值和最小值的数字
- Rand从一个最大值为75的数字(36)开始时是如何工作的
- 在C++中,我需要创建一个程序,该程序在输入某个数字时循环并停止,然后显示最大值和最小值
- 获取 2D 数组中数字的平均、最小值和最大值
- 使用 ifstream 读取列中随机生成的数字的文本文件,并从列表中查找最小值和最大值
- 为什么我的c++算法总是为一个数字的最小值和最大值返回相同的值
- C/C++宏,用于在不使用三元运算符的情况下查找两个数字的最大值
- MPI帮助查找n个数字的最大值
- 一种基于最大值包装/溢出数字的算法