0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 15
|
|
1 | |
Быстрый поиск супернатуральных чисел26.09.2013, 16:55. Показов 2413. Ответов 21
Метки нет (Все метки)
Натуральное число будем называть супернатуральным, если в своем десятичном виде оно не содержит единиц, а произведение всех его цифр равно n. Для заданного n выясните, сколько существует супернатуральных чисел.
Технические условия Входные данные: Содержит одно целое число n, не превосходящее 2×109. Выходные данные: Вывести количество супернатуральных чисел по модулю 101. Информация о задаче: Лимит времени: 1 секунда Лимит памяти: 256 Mб Пример входных данных 6 Пример выходных данных 3
0
|
26.09.2013, 16:55 | |
Ответы с готовыми решениями:
21
Быстрый поиск совершенных чисел Быстрый поиск Быстрый поиск элемента Быстрый поиск в мапе |
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
|
26.09.2013, 17:25 | 2 |
хм по идее это надо найти на какие цифры от 2 до 9 наше n делится без остатка, определить количество повторений каждого из чисел, а потом высчитать максимальное количество не повторяющихся комбинаций из всех этих цифр. думается так.
Правда вот мне не понятен вопросик с нулем для нуля получается будет бесконечное множество, т.к. 0*а=0 Добавлено через 7 минут упс правда вот не знаю еще как решить проблемку с непростыми числами, 4,6,9,8 т.к. они вносят сложности Добавлено через 4 минуты Стоп. надо не число комбинаций, а число перестановок считать. И соответственно вычитать количество перестановок для повторяющихся элементов. И проблем не будет. с простыми числами, а вот с 4,6,8.9 еще не придумал все же
1
|
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 15
|
|
26.09.2013, 17:30 [ТС] | 3 |
наскалько я понимаю, то 4, 6, 8, 9 разлаживаються дальше на простые как 2*2, 2*3, 2*4 или 2*2*2, 3*3
0
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
||||||
26.09.2013, 18:01 | 4 | |||||
т.е. для представления только простыми числами получается такая вещь.
Добавлено через 2 минуты т.е число 8 можно представить в следующем виде 222 24 42 8 моя же программа разложит только на 222 Добавлено через 6 минут черт при 222 рез получится 0, но должно быть 1. где то промазал или не учел что-то Добавлено через 5 минут хм а если пойти от обратного! сначала делить на непростые числа, а потом остаток на простые. если получится разложить тогда посчитать результат. разложить одно непростое на простые и посчитать результат блин потом надо будет вернуть это раскладывать другое. муторно как то. блин у почему я не силен в комбинаторике Добавлено через 10 минут блин может тут какой-то табличный метот используется а не формулами Помнится есть такой способ нахождения простых чисел путем создания решета где из таблицы чисел вычеркиваются все числа кратные простому после его получения. может и тут так Добавлено через 44 секунды как бы было бы хорошо не используйся в задаче числа 4,6,8,9
0
|
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 15
|
|
26.09.2013, 18:06 [ТС] | 5 |
ето точно
0
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
|
26.09.2013, 20:59 | 6 |
Блин пока ехал с работы домой все голову ломал. Да только понял что хорошая штука "разделяй и влавствууй".
Задача то в прочем решена Создана песочница получения количества чисел получаемых из указанного набора цифр (массив nums), нам остается только для сложных цифр изменять набор в песочнице и добавлять к общей сумме полученный новый набор чисел. так сделав циклами перебор учитывающий все варианты получим результат. А вот уже имея рабочий код можно искать оптимизацию. и еще немного не понятно условие Если интересно могу ближайшее время написать код решения задачи как он мне видится. но не обещаю положенного быстродействия. (все же лучше чем ничего воообще)
0
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
||||||
27.09.2013, 17:34 | 8 | |||||
Готово
блин вроде даже работает и быстро ищет многие вещи делались для более понятного вида и сокращение циклов (в частности факториал у меня табличный и считается только 1 раз самый большой заполняющий таблицу)
Добавлено через 5 минут Важная заметка. В случае когда большое количество повторяющихся цифр и соответственно большое число перестановок которые не меняют числа програма может давать погрешность, что связанно с точностью типа дабл. Для избежания постоянного цикличного пересчета количества ненужных перестановок ввел функция которая рассчитывает изменения количества бесполезных перестановок в соответствии с изменением количественного показателя одной цифры. Осуществляя относительные изменения, вот тут и может быть накопительная ошибка, но думаю данный случай достаточно редок и является допустимым Добавлено через 1 минуту natashka69, смотри проверяй пользуйся комментариев не ставил, чтобы хоть при разборе кода алгоритм выстроился и не даром для головы прошел код Добавлено через 16 минут кстати тут нет функции подсчета затраченного процессорного времени для решения задачи. т.ч. это тоже прикручивать надо, т.к. в условии требуется чтобы прога выполнялась менее секунды. Хотя по мне так это не точное условие, т.к. на моей домашней оно считает мигом, но не факт что она быстро будет считать на дохленькой машинке, которая еще и сама по себе тормозит . Т.ч. без хардварных характеристик требовать оптимальную работу по времени порой глупо
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
||||||
27.09.2013, 22:37 | 9 | |||||
решение, которое проходит все тесты вот тут: http://www.e-olimp.com/problems/6082
HedgehogLu, для n=24 количество супернатуральных чисел равно 17, а твоя прога выдает 30
0
|
zer0mail
|
27.09.2013, 23:13
#10
|
Не по теме: Имхо, просить решить олимпидные задачи - это как просить изготовить инструмент для взлома. В результате конкурс пройдет не тот, кто сам решил 5 задач, а тот, кто на форумах выклянчил решение 7 задач :negative: Вот только в отличии от взломщика, плоды взлома со временем обязательно вылезут боком.
2
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
||||||
28.09.2013, 11:55 | 11 | |||||
мдя алгоритмическая ошибочка есть
Добавлено через 1 час 52 минуты Да были недочеты, т.к. не правильно вычитал количество комбинаций (изначально расчет не правильный был, т.к. влияние повторов разных чисел не ссумируется а у множается, более того забыл влючать повторные расчеты прошлых комбинаций при измененни набора цифр при 8,9 и 6. Вроде все надочеты исправил (не пишите программы по ночам )
1
|
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 15
|
|
29.09.2013, 15:23 [ТС] | 12 |
спасибо)
0
|
30.09.2013, 12:00 | 13 | ||||||||||||||||||||
Ну вот ещё и мой вариант. Написал ещё в субботу, но дома инета нет, пришлось ждать пока на работу выйду, чтоб выложить.
Ошибся когда выкладывал. Вот так правильней:
HedgehogLu, c initfact хорошая идея. Сразу не подумал о том, чтоб вычислить факториалы 1 раз Добавлено через 1 час 51 минуту HedgehogLu, проверил работоспособность вашего кода. Для n=144 ваша программа выдает результат: n=144 num count 2 4 3 2 4 0 5 0 6 0 7 0 8 0 9 0 ostatok = 1 rescomb=48 result=15 4 returned 36 84 returned 48 984 returned 48 4 returned 24 84 returned 30 4 returned 3 84 returned 3 6984 returned 107 144 imeet 122 supernaturalnih chisel Я так понимаю ответ 122, а должен быть 148. Код не рабочий!!! Добавлено через 2 минуты В моем сообщении (в последнем коде) должно быть вместо 302-й строки
ya_noob, твой код работает правильно. Помоги понять, как он работает Добавлено через 2 минуты Ну и чтоб уж польностью соответствовал заданию, добавлю и я вывод по модулю 101:
1
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
||||||
30.09.2013, 15:46 | 14 | |||||
Algoritmer, Блин ну говорилось же не пиши ночью если отладку делать, то делать качественно
Вот скажите с каких пор 3*3*3=9? Опять попался на том, что суммировал а не умножал. Алгоритм верный а попался 2 раза просто на том что спутал операции суммирования и умножения. Приведу кусок который исправить надобно
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|
30.09.2013, 19:45 | 15 |
Algoritmer, ваш код крашится у меня при больших значениях (типа 2*10^9) (много памяти ест, в условии сказано ограничение памяти в 256 мб).
всё просто! перебираем все возможные комбинации цифр, произведение которых равно данному + динамическое программирование, чтобы не пересчитывать комбинации цифр с одинаковым произведением (иначе будет экспоненциальная сложность)
0
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
|
30.09.2013, 20:54 | 16 |
ya_noob, а ваш походу не особо точен если убрать модуль 101 хотя еще не пойму почему
0
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
|
01.10.2013, 10:25 | 18 |
да в программе ya_noob, все очень просто
там рекурсивно находится число комбинаций которым может быть построено число, при этом, чтобы постоянно не спускаться вниз создается индексный массив в котором уже хранится полученное число комбинаций. За счет того, что порядок цифр определяется делением повторов не возникает. Algoritmer если в индексированном массиве уже есть результат для данного числа то вернуть добавить уже ранее высчитанный результат добавляем в индексный массив результат для числа n[/quote] Добавлено через 1 минуту но блин рекурсия штука порой опасная (т.к. размер стека у программы значительно меньше чем пользовательская память. и порой на не очень больших рекурсиях можно споткнутся об ошибку переполнения стека)
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|
01.10.2013, 11:36 | 19 |
Ести убрать модуль 101, то задача вообще будет работать неправильно. Т.к. результат хранится в переменной типа char, то очень скоро произойдет переполнение и будет считаться всякая ерунда. Да и вообще зачем убирать модуль, ведь в задаче ясно сказано про него.
но не в данной задаче. максимальное количество цифр в числе <= 30 (худший случай: 2*2*2*2*2... (30 штук)), следовательно глубина рекурсии всего 30 (учитывая первый вызов функции). а это пару килобайт.
0
|
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
|
|
01.10.2013, 11:54 | 20 |
cya_noob, странно то, что даже если я сделаю результат типа дабл и произведу все необходимые изменения типов для других переменных у меня все одно программа почему-то возвращает результат -105 если уберу модуль 101
Не по теме: по поводу рекурсии я просто высказал свое мнение. просто как напоминание,чтобы люди не злоупотребляли рекурсией покупаясь на ее простоту.
0
|
01.10.2013, 11:54 | |
01.10.2013, 11:54 | |
Помогаю со студенческими работами здесь
20
Быстрый поиск в векторе из pair Быстрый поиск минимального числа Быстрый поиск по полям в коллекции Быстрый поиск ip адреса в текстовом файле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |