|
3 / 3 / 0
Регистрация: 03.06.2019
Сообщений: 64
|
||||||
Как можно оптимизировать решение данной задачи?08.01.2020, 23:35. Показов 3206. Ответов 28
Метки нет (Все метки)
Всем привет!
Есть задачка, вот условие: Напишите функцию, которая принимает в качестве параметра целое число n и возвращает true, если число n! % (n^2) == 0. Вроде все понятно, вот только задача непростая, ведь максимум n, для которого она хоть что-либо может предложить(если делать по-простому, то есть считать каждое выражение), это примерно 20-25. Дальше все. Поэтому вот алгоритм, по которому делал я: Разбил число n ^ 2 на делители, поместил в масив nPw. Разбил числа от 1 до n на делители, поместил в values. Вычеркнул общие члены для массивов; если в nPw остались элементы, то число n! не делится на n ^ 2. Если что, вот код:
Подскажите, плиз, как можно оптимизировать алгоритм и почему, как вы думаете, вылазит ошибка?
0
|
||||||
| 08.01.2020, 23:35 | |
|
Ответы с готовыми решениями:
28
Как можно оптимизировать программу? Как можно оптимизировать код? |
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||
| 08.01.2020, 23:58 | ||
|
И совершенно не нужно делать вектор из самих делителей. Достаточно запоминать количество каждого простого делителя в n. Анализируя делители (n-1)! надо просто вычитать из элементов получившегося вектора. Если остались положительные значения - не делится. А возможно, лучше наоборот. Сначала составит вектор количеств делителей (n-1)! А затем пройтись по n. Получилось отрицательное - не делится.
0
|
||
|
Just Do It!
|
||||||
| 09.01.2020, 09:22 | ||||||
|
NuMeRiC_,
проверьте у себя в валидаторе:
1
|
||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 09.01.2020, 09:38 | |||||||
Сообщение было отмечено Байт как решение
Решение(A*B) mod C=((A mod C)*(B mod C)) mod C Проще говоря, если вам нужно найти остаток от деления на C, то вы можете все сомножители урезать до X mod C (в нашем случае C=N*N). Что там у них в старших разрядах было - наплевать, на конечный результат это не влияет. А раз можно сомножители урезать, можно считать большие факториалы, не паря мозг арифметическими переполнениями.
3
|
|||||||
|
Just Do It!
|
|||||||
| 09.01.2020, 09:58 | |||||||
если промежуточный результат будет равен нулю.
2
|
|||||||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|||
| 09.01.2020, 10:16 | |||
|
XLAT, вы хоть примерно представляете, с какого порядка числами придется иметь дело?
0
|
|||
|
4081 / 2679 / 432
Регистрация: 09.09.2017
Сообщений: 11,897
|
||||||
| 09.01.2020, 10:21 | ||||||
|
А если делить на факториал на квадрат, а наоборот, квадрат на множители? С учетом, что n! делится на n, и n2 делится на n, достаточно чтобы n было представимо как произведение (1...n):
UPD: мой код не работает на n=9, буду думать дальше
0
|
||||||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||||
| 09.01.2020, 10:28 | ||||
|
Renji, Отличное решение!
Почему-то вчера вечером не допер...
![]() Добавлено через 1 минуту
0
|
||||
|
4081 / 2679 / 432
Регистрация: 09.09.2017
Сообщений: 11,897
|
||||||
| 09.01.2020, 10:32 | ||||||
|
Скорее всего, делить надо не на сомножитель факториала, а на его делители:
0
|
||||||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 09.01.2020, 10:32 | |
|
NuMeRiC_, мое решение в принципе тоже можно было бы довести до ума. Но - не стоит. Оно вполне громоздко, тяжело изложено и трудоемко. В то время как решение уважаемого Renji просто, элегантно, естественно и реализуется в 3 строки.
0
|
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|||||||
| 09.01.2020, 10:39 | |||||||
|
COKPOWEHEU, Да глупости все это!
(скопипастено у Renji, ) ![]() Добавлено через 2 минуты
0
|
|||||||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 09.01.2020, 10:55 | |
|
XLAT, да, приношу извинения. Не заметил, что r %= nn. Процентик пропустил. Бес попутал.
1
|
|
|
Just Do It!
|
||
| 09.01.2020, 11:27 | ||
|
на самом деле, как видно из первопоста, это ещё не является решением. я имею ввиду в плане оптимизации. Вот такая ситуация: на вход функции foo(n) будут подаваться разные n из некоторого рандомного множества. Что будет происходить: Наш факториал будет вычисляться повторно каждый раз! А нужно: при повторном вычислении функция должна использовать уже вычисленные факториалы из организованного хранилища. автор топика об этом не упоминает явно, поэтому это просто моя догадка.
0
|
||
|
4081 / 2679 / 432
Регистрация: 09.09.2017
Сообщений: 11,897
|
|
| 09.01.2020, 12:45 | |
|
А нужно ли? Сложность алгоритма и так невелика. На кеширование результатов (кстати, каких? Хранить факториал целиком нельзя, он слишком большой, а остатки от деления факториалов зависят от входного числа и будут всегда разными) потребуется память, то есть даже в случае выигрыша по скорости (кстати, не факт что он вообще будет: умножение не такая дорогая операция) будет проигрыш по памяти.
А самое главное - как код будет оформлен в конечном итоге. Мне, например, представляется скорее в виде отдельной утилиты, запускаемой для каждого числа заново. Оно и в формулировке ТСа скорее всего так будет, у него ведь автоматизированное тестирование.
0
|
|
|
Just Do It!
|
||
| 09.01.2020, 13:40 | ||
|
особенно, если множество n не рандомное, а некий диапазон, причем сортированный. Запустите мой тест и увидите на секундомере сколько нужно время для 30 n. Особенно, когда идет вычисление с результатом false. И не нужно ни какой дополнительной памяти, кроме 8 байт для last n (последнего вычисленного факториала). я не стал это делать, потому про это у автора сказано всего лишь, что нужна некая оптимизация, т.е. это как некий намёк и не более. Но то что я предложил, уж слишком просто, чтобы быть окончательным решением. ![]() Добавлено через 14 минут ps: нет, это здесь, не прокатит.
0
|
||
|
4081 / 2679 / 432
Регистрация: 09.09.2017
Сообщений: 11,897
|
||
| 09.01.2020, 14:49 | ||
|
Но ваш вариант переполняется, например, на n=1318.
0
|
||
|
Just Do It!
|
||
| 09.01.2020, 15:33 | ||
|
COKPOWEHEU, ладно, ладно ![]() вот тут я же поправлялся: пост(мой) номер 5 Добавлено через 44 секунды вместо i < n; нужно i <= n;
0
|
||
|
4081 / 2679 / 432
Регистрация: 09.09.2017
Сообщений: 11,897
|
||
| 09.01.2020, 18:30 | ||
i<=n, в том виде я и копировал.Во избежание недоразумений проверьте до n=2800 и выложите код, который точно не переполняется. Для поиска подозрительных мест можно сравнивать с моим вариантом. Во-первых, там нечему переполняться, поскольку нет сложений и умножений, а во-вторых, подозрительные места на то и подозрительные чтобы проверять вручную. Кстати, мне тут в голову пришло, что условие ТСа может оказаться эквивалентным проверке числа (n-1) на простоту. А ведь это тоже вполне стандартная задача.
0
|
||
| 09.01.2020, 18:30 | |
|
Помогаю со студенческими работами здесь
20
Как можно оптимизировать данный код? Можно как-то оптимизировать этот код?
Как составить формулу для данной задачи Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение/ Перевод
https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs
. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|