|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Дано натуральное N. Выяснить, у какого целого числа из отрезка 1...N будет наибольшая сумма делителей. время работы O(N), то есть линейное. Про память не сказано, но чем меньше тем лучше. Насчет размерности чисел не заморачиваемся, полагаем что любое число поместится в некую "числовую переменную", размер и все операции с которой - О(1) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 16:00 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Мне кажется что если игнорировать полные переборы то. Код: sql 1. 2. 3. 4. 5.
Оптимальная стратегия - может быть такая. Искать при набольшем N, наименьшее число делителей. Глазами видно что 254 выгоднее чем 256 т.к. первый имеет один делитель равный половине числа N. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 16:22 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton Код: sql 1.
на всякий: для каждого числа подразумевается сумма всех его делителей. То есть, к примеру, число 12: делители: 2, 3, 4, 6, 12, их сумма равна 27 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 16:43 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
А.... у меня голова забита факторизацией. Сорян. В руке молоток - и вижу кругом гвозди. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 16:46 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
В любом случае, при N=256 оно и будет ответом. А также при любых N= K^M. Очевидно, что и при простом N. Также очевидно, что ни один делитель N не будет ответом. Для остальных N на глаз и не скажу. Можно попробовать многочлены Sum(x10^y). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 19:08 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Как всегда поспешил выше. Простое N ответом не всегда будет.)) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 20:22 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1, Если N нечетное, то N-1. Иначе N. Пример: N=16, делители: (8,2) и (4,4). С наибольшей суммой делителей: 8+2=10 N=17, нечетное, простое, смотри N=16 N=18, делители: (9,2) и (6,3). С наибольшей суммой делителей: 9+2=11 N=19, нечетное, простое, смотри N=18 N=20, делители: (10,2) и (4,5). С наибольшей суммой делителей: 10+2=12 N=21, нечетное, делители: (7,3). С наибольшей суммой делителей: 7+3=10, смотри N=20 .... N=256, делители: (128,2), (64,4), (32,8) и (16,16). С наибольшей суммой делителей: 8+2=10 Время работы O(1) :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 20:42 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Если я правильно понял, то все возможные делители надо складывать, т.е. для степеней двойки ответ будет N*2-2 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 20:45 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1 на всякий: для каждого числа подразумевается сумма всех его делителей. То есть, к примеру, число 12: делители: 2, 3, 4, 6, 12, их сумма равна 27 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 22:58 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Корявенько поставлена задача. Надо добавить что делать с составными делителями. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 23:06 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
mayton, то, о чем пишет топикстартер, называется аликвотная сумма ( с точностью до почему-то забытой единицы). Определения здесь https://ru.wikipedia.org/wiki/Функция_делителей ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 23:13 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1 Дано натуральное N. Выяснить, у какого целого числа из отрезка 1...N будет наибольшая сумма делителей. время работы O(N), то есть линейное. Про память не сказано, но чем меньше тем лучше. Насчет размерности чисел не заморачиваемся, полагаем что любое число поместится в некую "числовую переменную", размер и все операции с которой - О(1) Делителями числа N будут различные комбинации этих простых делителей. Но, если будут одни двойки. то комбинации повторяются. Следовательно, простые делители должны быть разными. Тогда больше всего будет делителей у числа, которое есть Р! (факториал). Не совсем, лучше N - произведение различных минимальных простых чисел. А дальше можно думать о сумме этих делителей, в том числе 1 и N. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 09:37 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Соколинский Борис 4 для 16 дважды учитывается? mayton Надо добавить что делать с составными делителями. booby с точностью до почему-то забытой единицы прикольность известного мне прикольного решения в том, что там по ходу пьесы мы узнаем сумму делителей для каждого числа от 1 до N, причем на всё про всё нужно O(N) времени. То есть - О(1) на число. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 10:24 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1 прикольность известного мне прикольного решения в том, что там по ходу пьесы мы узнаем сумму делителей для каждого числа от 1 до N, причем на всё про всё нужно O(N) времени. То есть - О(1) на число. Ищется произведение простых чисел:2, 3, 5, 7, 11, и т.д. До тех пор, пока это произведение будет меньше N. Максимальным таким числом будет число М, M < N. Вот и ответ на 22376429 с учётом 22376695 . ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 11:31 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Gennadiy Usov Имя пользователя1 прикольность известного мне прикольного решения в том, что там по ходу пьесы мы узнаем сумму делителей для каждого числа от 1 до N, причем на всё про всё нужно O(N) времени. То есть - О(1) на число. Ищется произведение простых чисел:2, 3, 5, 7, 11, и т.д. До тех пор, пока это произведение будет меньше N. Максимальным таким числом будет число М, M < N. Вот и ответ на 22376429 с учётом 22376695 . Не сработает. Например N = 2048 = 2 11 , сумма получается 4094 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 11:40 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Dima T Не сработает. Например N = 2048 = 2 11 , сумма получается 4094 N = 2*3* 5* 7 *11 = 2310 то сумма всех делителей равна 6026: (1, N, по 1, по 2, по 3, по 4) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 11:59 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Gennadiy Usov Dima T Не сработает. Например N = 2048 = 2 11 , сумма получается 4094 N = 2*3* 5* 7 *11 = 2310 то сумма всех делителей равна 6026: (1, N, по 1, по 2, по 3, по 4) По условию N любое, так почему бы не 2048 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 12:00 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Dima T Gennadiy Usov пропущено... Если N = 2*3* 5* 7 *11 = 2310 то сумма всех делителей равна 6026: (1, N, по 1, по 2, по 3, по 4) По условию N любое, так почему бы не 2048 ? А для 2400? Получается 2 решения или больше? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 12:34 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Gennadiy Usov Dima T пропущено... По условию N любое, так почему бы не 2048 ? А для 2400? Получается 2 решения или больше? Не знаю, просто привел пример что это 22376801 неверное решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 12:37 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
А для троек - N = 2187 будет 3277. Тоже решение! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 12:38 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
ИМХО не уверен, но такое решение просится: раскладываем N на простые множители и то число у которого простых множителей больше - будет иметь большую итоговую сумму. Если простых множителей одинаково, то берем то, где сумма простых множителей больше которое больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 14:16 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1 прикольность известного мне прикольного решения в том, что там по ходу пьесы мы узнаем сумму делителей для каждого числа от 1 до N, причем на всё про всё нужно O(N) времени. То есть - О(1) на число. Давай сюда своё "прикольное" решение. Посмотрим на его прикольность. Но может так оказаться что факторизация о которой мы говорим - всё равно серебрянная пуля. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 14:21 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Утверждение автора: Имя пользователя1 прикольность известного мне прикольного решения в том, что там по ходу пьесы мы узнаем сумму делителей для каждого числа от 1 до N, причем на всё про всё нужно O(N) времени. То есть - О(1) на число. Gennadiy Usov Ищется произведение простых чисел:2, 3, 5, 7, 11, и т.д. Dima T такое решение просится: раскладываем N на простые множители mayton Давай сюда своё "прикольное" решение. Посмотрим на его прикольность. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 14:53 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
Имя пользователя1, вроде как задача на динамическое программирование, т.е. ответ должен следовать из знания решений для меньших аргументов ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 16:25 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#18+
kealon(Ruslan), это само собой. дельная мысль. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2021, 20:33 |
|
Пазл с прикольным решением
|
|||
---|---|---|---|
#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?all=1&fid=16&tid=1339628]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 432ms |
0 / 0 |