Это вопрос, который я делал на какой-то платформе онлайн-судей.Максимальная сумма коэффициентов чисел в заданном диапазоне
Найти максимальную сумму коэффициентов чисел от 1 до N.
Например, если N должны были быть 11, то ответ будет 18. Число с наибольшей суммой коэффициентов от 1 до 11, 10 (1 + 2 + 5 + 10).
Я реализовал относительно простое решение, которое выглядит как сито. Код в С ++, как показано ниже:
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, я Simpy выход mx[N]
. Это решение кажется правильным. Тем не менее, он превышает ограничение времени (1 с) для больших входов. Максимальное значение N равно 1 000 000, но пользователь может запросить 1000 000 различных значений N. Указанный код является кодом предварительной обработки, который запускается один раз.
Сложность вышеуказанного кода N + N/2 + N/3 + ... + 1, который, я полагаю, около N Log N. Как я могу улучшить сложность этого кода?
Благодарим за помощь.
Подумайте о простой факторизации. –
@AbdenaceurLichiheb Если бы я использовал основную факторизацию, разве это не было бы слишком трудоемким? Поправьте меня, если я ошибаюсь, но с простой факторизацией мне придется найти все основные факторы числа, прежде чем приступать к вычислению суммы факторов. –
Этот вопрос слишком расплывчатый для переполнения стека. Существует неограниченное количество ответов. Пожалуйста, сосредоточьте свой вопрос на конкретном аспекте вашего кода. – xaxxon