Здравствуйте. Сегодня, 5 января, прошел первый тур областной олимпиады Республики Казахстан для 11 класса по информатике. Все уже поучаствовали, условия задач появились на оффициальном сайте (кто не верит — https://daryn.kz/olympiads/view/4/2982, вторая ссылка на ЯД, В скачанном архиве еще один архив информатика, там условия), а значит никто не может их дорешать. Поэтому предлагаю обсудить решение третьей, последней задачи C. Для удобства ниже представлено условие. (Также интересуют подходы к частичным решениям, пусть даже и очевидные, например, дп по маске к первой подзадаче)
Здесь можно дорешивать клик.
Рассмотрим все непустые подмножества, их $$$2^N-1$$$. Так как условия "$$$x$$$ входит в подмножество" и "$$$x$$$ не входит в подмножество" противоположные, то можно найти, сколько есть подмножеств, в которые $$$x$$$ входит, а затем вычесть их из количества всех подмножеств.
Так как побитовый AND меньше либо равен своим аргументам, то $$$x$$$ — минимум в подмножестве. Пусть $$$x=100101011010$$$ в двоичном представлении, тогда в подмножество, в котором будет $$$x$$$, мы можем включить любые элементы, которые не испортят побитовое AND, то есть, те числа, у которых те биты, которые равны $$$1$$$ в $$$x$$$, равны $$$1$$$ и в них. То есть, в данном случае, к $$$x$$$ мы можем добавить любые элементы, удовлетворяющие шаблону $$$1??1?1?11?1?$$$, где $$$?$$$ означает, что на этом месте может стоять любой бит.
Теперь, если выполнить инверсию над элементами массива, то эта задача сведется к стандартной sum over subsets: на примере того же $$$x$$$ шаблон превратится в $$$011010100101$$$, где $$$1$$$ — любой бит, $$$0$$$ — строго нулевой, а значит, подойдет любое число, множество единичных битов которого является подмножеством единичных битов шаблона.
Первым делом посчитаем динамику по подмножествам: для каждой битовой маски сколько есть чисел, множество единичных битов которых является подмножеством единичных битов данной маски.
После того, как мы эти количества посчитали, мы можем, наконец, перебрать все минимумы $$$x$$$ и для каждого минимума сказать, сколько подмножеств мы можем с ним составить, комбинаторно. код.
К полному решению, предложенному выше, могу добавить следующее:
Для 3 подзадачи динамку можно считать для каждого элемента массива отдельно, просто перебрав все подмаски элемента и инкрементируя соответсвующее значение в динамике. Асимптотика $$$O(2^{10}\cdot n)$$$.
Для решения 4 подзадачи можно подсчитать количество вхождений каждого элемента, а затем перебрать все маски и их подмаски (e-maxx). Асимптотика $$$O(3^{15} + n)$$$