Пробую зайти с другой стороны.
Пусть куски пронумерованы по возрастанию:
.
На первом этапе выпишем всевозможные системы уравнений для разбиения на равные части. Для
это будут разбиения на на 8, 7, 6 и 5 равных частей, дающих 4 группы из 7+6+5+4 = 22 уравнений.
Например, для
решения из 16 кусков для первые 7 уравнений будут такими:
Вторые 6 уравнений:
(дальше не буду выписывать, надеюсь, понятно).
На этом этапе нашей задачей будет перебрать всевозможные такие системы уравнений, стараясь отсечь как можно больше бесперспективных вариантов. Например, если в системе попались уравнения
, то её можно смело выкинуть, так как куски идут по возрастанию (даже если
, ничто нам не мешает записать то же уравнение как
). Далее, для разбиений на
частей любая
-я часть будет состоять минимум из двух кусков (уравнения вида
исключаются).
Здесь мы ещё уравнения не решаем, поэтому выгодно записывать их более компактно, как собственно разбиения:
1234567887654321 — для первой группы уравнений (разбиение на 8 частей), назовём его
8-разбиением.
1123245672765143 — для второй группы уравнений (разбиение на 7 частей), назовём его
7-разбиением, и т.д..
и перебирать символьные строки по определённым правилам.
Я пока дошёл только до этого этапа, и то для разбиений не более чем на 7 частей из не более чем 13 кусков.
Я сконцентрировался на 7 частях и 13 кусках, дальше будет только про этот вариант.
После указанных оптимизаций у меня получилось 740 возможных 7-разбиений тринадцати кусков, 6-разбиений — 87, 5-разбиений — 11972 и 4-разбиений — 54473. Пока что слишком много, чтобы перебирать их всевозможные сочетания, поэтому нужен дополнительный этап оптимизации.
На втором этапе планируется группировать найденные
-разбиения друг с другом, сначала по парам, жадно ища противоречия. Например, 5-разбиение 123
4441221553 несовместимо с 6-разбиением 11234
55514326, так как выделенный набор 444 весит меньше, чем выделенный набор 555 (в силу того, что куски идут по возрастанию), хотя первый составляет пятую часть торта, а второй — шестую. Затем группируем по тройкам, и т.д, пока не получим полные наборы разбиений, кажущиеся непротиворечивыми. Совершенно непонятно, сколько можно будет выгадать на такой оптимизации. Если не слишком много, то придётся начинать решать системы уравнений совместно друг с другом, не сгенерировав предварительно всё множество систем.
На третьем этапе вспомним, что разбиения задают системы уравнений и проверяем, какие системы имеют решение. Для этого последнее уравнение, определяющее, что сумма кусков равна единице, мы не привлекаем, а просто ищем те системы из 22-уравнений с 13-ю неизвестными, у которых ранг меньше максимального (то есть 12). Здесь тоже возможна оптимизация, мы ведь можем сначала проверить систему из первых 6+5+4=15 уравнений (не более миллиарда случаев), и если у неё ранг уже 13, то дальше искать нет смысла.
Преимущество такого подхода в том, что он действительно перебирает всевозможные варианты разбиений и позволяет строго доказать, что решения нет (ну, если мы в погоне за оптимизацией перебора не отсекли лишнего), или, если оно есть, находит его.