Конечно хотелось бы не
, а
, что очень сильно меньше.
Например, для
первое больше второго всего в 1.43 раза, для
уже в 2.4 раза, для
в 5.1 раза.
мне неизвестно, но оцениваю в 340млн, что в 11 раз меньше общего количества вариантов 3.8млрд. И это плохо, так как тогда
будет порядка 3e9 и в память точно не влезет, а
порядка 3e11 не влезет и на диск.
Еще кстати получается, что
симметрично с
. Что это может дать...
Ну, вообще-то
это просто все единицы в числе (ну или все нули если & заменить на | и маски
тоже инвертировать). Симметрия позволяет считать вдвое меньше, наверное. Но по моему только по одному любому
(вот нет бы по каждому).
Ну понятно что можно попробовать найти такой набор индексов, что
. Но не очень понятно, как это делать.
Для малых
(подразумеваю не номер шага, а простое число соответствующее шагу, до 40) можно и полным перебором, но фактически это и делается, только сразу над
. А вот дальше, для
, маски почти перестают перекрываться (в каждой всего 2-3 нулевых бита из 128 и вероятность их совмещения мала).
В принципе вроде можно построить список всех вариантов когда совмещаются нули в масках для больших
, быстрее полного перебора, наверное порядка
вместо
: после двух масок останется список длиной не произведением их размеров, а примерно утроенного количества любой из (для каждой первой маски из множества вторых подходят лишь 2-3), в остальных нули не совместятся, и уже на этот более короткий список натравливать следующую маску. Только а смысл? Ведь это лишь часть полного списка, остальной же тоже надо обрабатывать.
-- 07.05.2024, 20:49 --даже вопрос о принадлежности нуля итоговому множеству NP-труден.
Это в общем случае, у нас же маски
сильно специфичны (например начиная с некоторого
в них нули появляются на всех позициях) и появление нуля гарантировано, априори не очень понятно на какой итерации (хотя
Yadryara обосновал прекрасную оценку, хоть и завышенную).
-- 07.05.2024, 20:55 --В общем я так понял или сугубо вероятностные методы (типа HyperLogLog или CVM, про них ещё подумаю), или хотелки зарезать, ограничиться разумным размером, сделать битовый массив двойного-тройного размера (для уменьшения вероятности коллизий) и просто выставлять в нём бит при появлении элемента с заданным хешем. Как коэффициент заполнения приблизится к половине - вот дотуда и можно будет посчитать. Получится оценка снизу (из-за коллизий хеш-функции), но вроде неплохая. Уж на биты памяти точно хватит если в будущем её (или диска) хватит на 16-32 байтовые элементы.