Учитывая целое число N , подсчитайте, сколько способов его можно выразить как произведение M целых чисел> 1.
Входными данными являются просто N и M , а выходными данными является общее количество различных целочисленных групп. Это означает, что вы можете использовать целое число более одного раза, но каждая группа должна быть отдельной ( 3 x 2 x 2
не будет учитываться, если 2 x 2 x 3
присутствует).
Ограничения
1 < N <2 31
1 < M <30
Примеры
Ввод 30 2
дает вывод 3
, так как он может быть выражен 3 способами:
2 x 15
3 x 10
5 x 6
Ввод 16 3
дает вывод 1
, так как есть только одна отдельная группа:
2 x 2 x 4
Ввод 2310 4
дает вывод 10
:
5 x 6 x 7 x 11
3 x 7 x 10 x 11
3 x 5 x 11 x 14
3 x 5 x 7 x 22
2 x 7 x 11 x 15
2 x 5 x 11 x 21
2 x 5 x 7 x 33
2 x 3 x 11 x 35
2 x 3 x 7 x 55
2 x 3 x 5 x 77
Ввод 15 4
дает вывод 0
, так как это не может быть сделано.
правила
Применяются стандартные лазейки для гольфа, а также стандартные определения для ввода / вывода. Ответы могут быть функцией или полной программой. Встроенные функции для факторизации и / или разделения не допускаются, но другие в порядке. Код считается в байтах.
Ответы:
Pyth -
24232221 байтНе сложное решение. Будет больше играть в гольф. Просто берется декартово произведение списков и фильтров. Та же стратегия, что и у @optimizer (думаю, из-за его комментария, на самом деле не расшифровал CJam) Благодаря @FryAmTheEggman за 2 байта и трюк с M.
Определяет функцию
g
с аргументамиG
иH
Работал над всеми тестовыми аргументами, кроме последнего, на этом был слишком медленным, но не было указано ограничение по времени.
источник
M
определяя функциюg
2 аргументов,G
иH
. Вот что я получаю за этоMl{msdfqu*GHT1G^r2GH
. Всегда приятно видеть другого пользователя72 3
, который возвращает 5, но на самом деле есть 6 ответов,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
Python 3, 59
Подсчитаем потенциальные делители
i
. С дополнительным аргументомi
в качестве минимально допустимого делителя ядро рекурсивного отношенияДля каждого
i
мы либо решаем включить его (возможно, как повтор), в этом случае мы делим требуемый продуктN
наi
и уменьшаемM
. Если мы этого не сделаем, мы увеличимi
на 1, но только еслиi<N
, так как нет смысла проверять делители больше, чемN
.Когда минимальный делитель
i
превышаетN
, потенциальных делителей больше нет. Итак, мы проверяем, добились ли мы успеха, проверяя, еслиM==0 and N==1
, или, эквивалентно,M+1==N==1
илиM+1==N<2
, с каких порM+1==N
, взаимное значение гарантированно будет положительным целым числом (спасибо FryAmTheEggman за эту оптимизацию).Этот код вызовет переполнение стека на
N
1000 в большинстве систем, но вы можете запустить его в Stackless Python, чтобы избежать этого. Более того, он чрезвычайно медленный из-за его экспоненциального рекурсивного ветвления.источник
-~M==N<2
M
иN
. Благодарность!Руби, 67
На самом деле достаточно эффективно для рекурсивного определения. Для каждой пары делителей
[d,q]
n,d
будучи меньшей, мы суммируем результатf[q,m-1]
. Сложность состоит в том, что во внутренних вызовах мы ограничиваем факторы до значений, больших или равных d, чтобы мы не заканчивали двойной счет.источник
CJam, 48 байтов
Это может быть намного короче, но я добавил некоторые проверки, чтобы заставить его работать приличное количество
M
на онлайн-компиляторе.Попробуйте онлайн здесь
источник
2 1
. Ожидаемый результат: 1. Фактический результат: 0.T-SQL
456373Я уверен, что это сломается, когда входные данные даже близки к тому, чтобы быть большими.
Спасибо @MickyT за помощь в сохранении большого количества символов с помощью CONCAT и SELECTing вместо нескольких SET.
источник
SET @C+=',# A'+@
иSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
SET @C+=@D+'=@N'+@E+' SELECT @'
. Символ@N
находится внутри кавычек, делая его вне области действия при выполнении@C
. Кроме того, я думаю, что вы будете в конечном итоге подсчет дубликатовCONCAT
для построения ваших строк. Тогда вы можете броситьCONVERT
с. ПопробуйSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)
в своейWHILE
петле. Должен спасти вас разумное число