|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
запихну решение в спойлер. тут 1) для каждого числа n отрезка 1..N получаем минимальный простой делитель LP(n), за время O(N) 2) для каждого числа n выясняем максимальную степень LP(n) в составе числа, назовем это D(n), например, LP(12) == 2, D(12) = 2 2 = 4. Можно найти просто циклом (среднее количество итераций которого менее 2, то есть O(1)), можно использовать предыдущие результаты: если LP(n / LP(n)) === LP(n) , то D(n) = D(n / LP(n)) * LP(n) , иначе D(n) = LP(n) . Так или иначе, второй этап - O(N) 3) Сумму всех делителей числа n, обозначаемую S(n), можно представить в виде произведения. Например, n = a x * b y * c z , где a, b, c - простые. тогда сумма делителей S(n) = (1 + a + a 2 + ... + a x ) * (1 + b + b 2 + ... + b y ) * (1 + c + ... + c z ) = = (a x+1 - 1) / (a - 1) * (b y+1 - 1) / (b - 1) * (c z+1 - 1) / (c - 1) из чего следует S(n) = S(n / D(n)) * (D(n) * LP(n) - 1) / (LP(n) - 1) в этой формуле мы воспользовались ранее найденым результатом для одного из предыдущих чисел. ---- итого получается O(N) на всё про всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 11:35 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Не нравятся мне эти деления и возведения в степень. Может так случится что мы сложность алгоритма перенесли на сложность длинной арифметики. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 11:39 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton Не нравятся мне эти деления и возведения в степень. Может так случится что мы сложность алгоритма перенесли на сложность длинной арифметики. ну я сразу обозначил этот момент в стартовом посте: Имя пользователя1 Насчет размерности чисел не заморачиваемся, полагаем что любое число поместится в некую "числовую переменную", размер и все операции с которой - О(1) никто тогда не возмутился, значит все согласились ) деления, кстати, тут всегда дают целое число, никаких дробных чисел не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 11:46 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1 никто тогда не возмутился, значит все согласились ) деления, кстати, тут всегда дают целое число, никаких дробных чисел не будет. Никто не то чтобы не возмущался. А все сосредоточились на математической части этой задачи. Но поскольку форум у нас It-шный то и вопросы - из этой-же области тоже важны. Какой длины разрядная сетка нужна будет для решения твоей задачи если n = MAX_INT (максимальное целое длиной 32 бита) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 11:53 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton, если ты ещё раз глянешь формулы, то заметишь, что в расчетах никогда не всплывет число, большее искомой максимальной суммы делителей (которая, в свою очередь, менее чем 2N). Итого для N = MAX_INT нужно только 33 бита на число, ну то есть int64 хватит за глаза. Задачка не про длинную арифметику, а про обычную. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 12:24 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Хорошо. Убедил. Код давай. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 12:25 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Интересно: а где нужна сумма делителей? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 13:15 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1, сомнения есть насчёт O(N) для первого шага ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 13:16 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
kealon(Ruslan) Имя пользователя1, сомнения есть насчёт O(N) для первого шага Да здесь предполагается что мы уже знаем таблицу простых чисел до корня квадратного из N. Или уже есть функция с посчитанной комплексностью которая нам их выдает. Откуда мы ее знаем? Функцию или таблицу? Или мы ее уже где-то создали? Тоесть в задаче есть какие-то предварительные договоряки. Ох уж эти задачки от анонимных преподавателей... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 14:15 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton, как раз то алгоритм для таблицы простых числе лучше чем за O(N) найти можно - Решето Аткина но вот как из него найти заявленную функцию, я не могу придумать ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 16:18 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Задача пахнет олимпиадной. А для таких задач обычно не нужно привлекать сложные коробочные алгоритмы или библиотеки. И решение должно быть тоже простое. Прибавить. Отнять. Проверить condition. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 16:47 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
kealon(Ruslan) Имя пользователя1, сомнения есть насчёт O(N) для первого шага да, там вложенный цикл совершенно сбивает с толку. Но не надо поддаваться иллюзии! Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Рассмотрим заполнение массива lp. С простым индексом всё очевидно, он заполняется в ифе на соответствующей итерации внешнего цикла, т.е. один раз. Если же число i составное, то lp[i] заполнится на внешней итерации j, причем такой, что i == j * p, где p - простое. Докажем от противного, что такое j только одно для каждого составного i, и любое lp[i] заполняется только один раз. Допустим, это не так. Тогда для некоторого i заполнение lp[i] делается на внешних итерациях j1 и j2, таких что i == (j1 * p1) == (j2 * p2), где p1 и p2 - простые пусть j1 < j2, тогда p1 > p2 но тогда j1 делится на p2, и значит, LP(j1) < p1, и значит, на внешней итерации j1 внутренний цикл не доберется до простого числа p1 (так как перебираются простые не больше LP(j1)), и не будет затронута ячейка lp[i]. Противуречие. итак, каждое lp[i] заполняется только один раз. Поскольку во внутреннем цикле каждая итерация заполняет ячейку lp, то всего итераций всех внутренних циклов не более чем n. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 00:29 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Что-то перемудрил, можно проще) Рассмотрим заполнение массива lp. С простым индексом всё очевидно, он заполняется в ифе на соответствующей итерации внешнего цикла, т.е. один раз. Если же число i составное, то lp[i] может заполнится только на внешней итерации вида j == i/p, где p - некоторый простой делитель i. Заметим, что здесь p <= LP(j), так как во внутреннем цикле перебираются только такие p. Получается, p == LP(i), тогда j = i/LP(i), то есть такое j возможно только одно для каждого i. Итого, каждое lp[i] заполняется только один раз. Поскольку во внутреннем цикле каждая итерация заполняет ячейку lp, то всего итераций всех внутренних циклов не более чем n. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 01:15 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1, пардонс, увидел, браузер по ссылке не показал место с доказательством ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 09:30 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
kealon(Ruslan), Ага, в Википедии не доказано. Но этот алгоритм хотя бы упоминается, в английской версии его вообще нет ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 10:39 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton А для таких задач обычно не нужно привлекать сложные коробочные алгоритмы или библиотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 10:42 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1 mayton А для таких задач обычно не нужно привлекать сложные коробочные алгоритмы или библиотеки. Я видел олимпиады на Турбо-Паскале. Какая там стандартная библиотека? Решета Аткина там точно нету. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 11:04 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton Я видел олимпиады на Турбо-Паскале. Какая там стандартная библиотека? mayton Решета Аткина там точно нету. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 11:11 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
А где в этом коде результат? Я имею в виду число с наибольшей суммой делителей. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
P.S. И на каком это языке кстати? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 11:21 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton, Если что, обсуждался алгоритм из Википедии (который в п.1 решения). Руслан спросил о линейности алгоритма, я расписал почему считаю этот алгоритм линейным. Полный код чуть позже запилю. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 12:23 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Вот так... поманил конфетой. Давай уже как только так сразу и выкладывай. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 12:58 |
|
|
start [/forum/topic.php?fid=16&gotonew=1&tid=1339628]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
11ms |
get first new msg: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 252ms |
total: | 430ms |
0 / 0 |