Мы определим как список различных степеней 2, которые суммируются с x . Например, V ( 35 ) = [ 32 , 2 , 1 ] .
По соглашению, полномочия сортируются здесь от наивысшего к низшему. Но это не влияет ни на логику задачи, ни на ожидаемые решения.
задача
При заданном полупростом замените каждый член в V ( N ) другим списком степеней 2 , суммирующим этот термин, таким образом, чтобы объединение всех результирующих подсписков было точным покрытием матрицы M, определенной как:
где и Q являются главными факторами N .
Это гораздо легче понять на некоторых примерах.
Пример № 1
Для имеем:
- и V ( P ) = [ 4 , 2 , 1 ]
- и V ( Q ) = [ 2 , 1 ]
Чтобы превратить в точное покрытие M , мы можем разбить 16 на 8 + 4 + 4 и 4 на 2 + 2 , а 1 оставить без изменений. Таким образом, возможный вывод:
Еще один действительный вывод:
Пример № 2
Для имеем:
- и V ( P ) = [ 32 , 4 , 1 ]
- и V ( Q ) = [ 16 , 4 , 2 , 1 ]
Возможный вывод:
правила
- Поскольку факторизация не является основной частью задачи, вы можете попеременно принимать P и Q в качестве входных данных.
- Если существует несколько возможных решений, вы можете вернуть только одно из них или все из них.
- Вы можете поочередно возвращать показатели степени (например, вместо [ [ 8 , 4 , 4 ] , [ 2 , 2 ] , [ 1 ] ] ).
- Порядок подсписков не имеет значения, равно как и порядок терминов в каждом подсписке.
- Для некоторых полупримесов вам не придется разбивать какой-либо термин, потому что уже является идеальным прикрытием M (см. A235040 ). Но вам все равно придется возвращать список (одноэлементных) списков, таких как [ [ 8 ] , [ 4 ] , [ 2 ] , [ 1 ] ] для N = 15 .
- Это код-гольф !
Контрольные примеры
Input | Possible output
-------+-----------------------------------------------------------------------------
9 | [ [ 4, 2, 2 ], [ 1 ] ]
15 | [ [ 8 ], [ 4 ], [ 2 ], [ 1 ] ]
21 | [ [ 8, 4, 4 ], [ 2, 2 ], [ 1 ] ]
51 | [ [ 32 ], [ 16 ], [ 2 ], [ 1 ] ]
129 | [ [ 64, 32, 16, 8, 4, 2, 2 ], [ 1 ] ]
159 | [ [ 64, 32, 32 ], [ 16 ], [ 8 ], [ 4 ], [ 2 ], [ 1 ] ]
161 | [ [ 64, 32, 16, 16 ], [ 8, 8, 4, 4, 4, 2, 2 ], [ 1 ] ]
201 | [ [ 128 ], [ 64 ], [ 4, 2, 2 ], [ 1 ] ]
403 | [ [ 128, 64, 64 ], [ 32, 32, 16, 16, 16, 8, 8 ], [ 8, 4, 4 ], [ 2 ], [ 1 ] ]
851 | [ [ 512 ], [ 128, 64, 64 ], [ 32, 16, 16 ], [ 8, 4, 4 ], [ 2 ], [ 1 ] ]
2307 | [ [ 1024, 512, 512 ], [ 256 ], [ 2 ], [ 1 ] ]
Ответы:
K (нгн / к) ,
6663 байтаПопробуйте онлайн!
принимает (P; Q) вместо N
алгоритм:
вычислить A как частичные суммы V (P * Q)
умножить каждое V (P) на каждое V (Q), отсортировать произведения в порядке убывания (назовем это R) и вычислить их частичные суммы B
найти позиции тех элементов в B, которые также встречаются в A; вырезать R сразу после этих позиций
источник
Желе , 24 байта
Монадическая ссылка, принимающая список из двух целых чисел,
[P, Q]
который выдает один возможный список списков, как описано в вопросе.Попробуйте онлайн! (нижний колонтитул выводит строковое представление, чтобы показать список таким, какой он есть на самом деле)
Или посмотрите набор тестов (взяв список N и переупорядочив результаты, чтобы они были такими же, как в вопросе)
Как?
Мы всегда можем жадно нарезать элементы снизу вверх (либо в M есть 1, либо у нас было 4 , когда M = [ [ 4 ] ]M 1 M 4 M=[[4]] ), чтобы найти решение.
Примечание: код собирает все (одно!) Такие решения в список, а затем получает результат заголовка (только) - т.е. необходим окончательный заголовок, поскольку разделы не всех возможных порядков.
источник
Python 2 ,
261233232231 байтПопробуйте онлайн!
1 байт от Джо Кинга ; и еще 1 байт из-за Кевина Круйссена .
Принимает в качестве ввода
p,q
. Преследует жадный алгоритм.источник
-k-1
может быть~k
.i,j
Назначение может бытьi,j=[i+1,i,0,j+1][j+1<len(v)::2]
для -1 байтwhile v[j]>-m
может бытьwhile-m<v[j]
Желе , 41 байт
Попробуйте онлайн!
ÇIP$Ƈ
источник
Желе , 34 байта
Попробуйте онлайн!
Формат ввода:
[P, Q]
(ссылка TIO выше не принимает это, но вместо этого одно число, чтобы помочь с тестовыми случаями).Выходной формат: список всех решений (отображается как сеточное представление трехмерного списка через TIO).
Скорость: черепаха.
источник
Pyth , 27 байт
Вдохновленный тем, что Джонатан Аллан подавил мой раствор желе . принимаетN в качестве ввода.
Попробуй это здесь!
источник
Haskell,
281195 байтисточник
(==)
, использовать1>0
вместоTrue
и не использоватьwhere
. Такжеn'
можно сократить. С этим вы можете сэкономить 72 байта: попробуйте онлайн!