Бінарні поліноми#5758

Бінарні поліноми

1 секунда
64 мегабайти
Середня

Кожне відображення множини \{0,1\}^n -вимірних бінарних векторів у називається булевою функцією змінних і позначається як f(x_n,x_{n-1},...,x_1). У криптографії деякі властивості булевих функцій є особливо цікавими. Позначимо через B(n,k) множину -вимірних бінарних векторів, які містять одиниць. Ваше завдання полягає в тому, щоб для заданої булевої функції визначити кількість векторів (b_n,b_{n-1},...,b_1) з B(n,k), для яких виконується f(b_n,b_{n-1},...,b_1)=1.

Булева функція буде задана своїм (унікальним) поліномом за модулем . У цих поліномах використовуються операції додавання та множення за модулем , як показано в таблицях на Рис. 1. У поліномі функції будь-який добуток змінних x_{i1} x_{i2} ... x_{im} може бути присутнім або відсутнім. Таким чином, загальна форма полінома для змінних виглядає так:

a_0+a_1x_1+a_2x_2+a_3x_2x_1+a_4x_3+a_5x_3x_1+a_6x_3x_2+a_7x_3x_2x_1+...+a_nx_nx_{n-1}...x_1

де всі коефіцієнти a_j, j=0,1,...,N=2^n-1, є або . Якщо коефіцієнт дорівнює , ми опускаємо відповідний добуток, а якщо дорівнює , ми просто не пишемо коефіцієнт. Наприклад, поліном булевої функції диз'юнкції змінних, наведений на Рис. 2, виглядає як 0+1 \cdot x_1+1 \cdot x_2+1 \cdot x_2x_1=x_1+x_2+x_2x_1.

Вхідні дані

Ваша програма повинна бути готова обробляти більше ніж один тестовий випадок. Перша строка вхідного файлу містить лише число тестових випадків. Кожна з наступних строк описує одну функцію - спочатку числа та , розділені одним пробілом (1 \le n \le 18, 0 \le k \le n), а потім, розділені ще одним пробілом, рядок з 2^n символів та , які є коефіцієнтами відповідного полінома, впорядкованими, як у загальній формі полінома, наведеної вище.

Вихідні дані

Вихідний файл повинен містити рядків, кожен з одним числом - кількість векторів, знайдених вашою програмою.

Приклади

Приклад 1

Loading
Loading