이진 다항식

시간 제한1초메모리 제한128 MB

요약
n개 변수를 갖는 불리언 함수의 다항식 계수가 주어질 때, 1의 개수가 정확히 k개인 입력 벡터 중 함수값이 1이 되는 벡터의 개수를 구합니다.
난이도

보통10점 중 6점

유형
비트 연산, 조합론, 완전 탐색, 수학
정답자
아직 제출이 없습니다

문제

nn차원 이진 벡터의 집합 {0,1}n\{0,1\}^n에서 {0,1}\{0,1\}로 가는 각 함수 ff를 nn변수 불 함수(Boolean function)라 하고 f(xn,xn−1,…,x1)f(x_n, x_{n-1}, \ldots, x_1)로 나타낸다. 암호학에서는 불 함수의 몇 가지 성질이 중요하다. B(n,k)B(n,k)를 정확히 kk개의 11을 가지는 nn차원 이진 벡터들의 집합이라 하자. 주어진 불 함수 ff에 대해, B(n,k)B(n,k)에 속하면서 f(bn,bn−1,…,b1)=1f(b_n, b_{n-1}, \ldots, b_1) = 1을 만족하는 벡터 (bn,bn−1,…,b1)(b_n, b_{n-1}, \ldots, b_1)의 개수를 구하는 것이 문제이다.

불 함수는 그 (유일한) 2를 법으로 하는 다항식으로 주어진다. 이 다항식에서는 Fig. 1의 표에 정의된 대로 22를 법으로 하는 덧셈과 곱셈을 사용한다. 함수의 다항식에서 mm개의 변수의 곱 xi1xi2⋯ximx_{i_1} x_{i_2} \cdots x_{i_m}은 나타날 수도 있고 나타나지 않을 수도 있다. 따라서 nn변수 다항식의 일반형은 다음과 같다.

a0+a1x1+a2x2+a3x2x1+a4x3+a5x3x1+a6x3x2+a7x3x2x1+⋯+aNxnxn−1⋯x1a_0 + a_1 x_1 + a_2 x_2 + a_3 x_2 x_1 + a_4 x_3 + a_5 x_3 x_1 + a_6 x_3 x_2 + a_7 x_3 x_2 x_1 + \cdots + a_N x_n x_{n-1} \cdots x_1

여기서 모든 계수 aja_j (j=0,1,…,N=2n−1j = 0, 1, \ldots, N = 2^n - 1)는 00 또는 11이다. 계수가 00이면 해당 곱을 생략하고, 11이면 계수 자체를 생략한다. 예를 들어 Fig. 2에 주어진 "두 변수의 논리합(disjunction)" 불 함수의 다항식은 0+1⋅x1+1⋅x2+1⋅x2x1=x1+x2+x2x10 + 1 \cdot x_1 + 1 \cdot x_2 + 1 \cdot x_2 x_1 = x_1 + x_2 + x_2 x_1이다.

그림 1

그림 2

입력

프로그램은 여러 개의 테스트 케이스를 처리할 수 있어야 한다. 입력의 첫째 줄에는 테스트 케이스의 개수 TT가 주어진다. 다음 TT개의 줄에는 각각 하나의 함수가 주어진다. 먼저 공백 하나로 구분된 두 수 nn과 kk (1≤n≤181 \le n \le 18, 0≤k≤n0 \le k \le n)가 주어지고, 다시 공백 하나로 구분되어 위의 일반형 순서대로 나열된 다항식 계수인 2n2^n개의 00과 11로 이루어진 문자열이 주어진다.

출력

TT개의 줄을 출력하며, 각 줄에는 해당 함수에 대해 찾은 벡터의 개수를 하나의 수로 출력한다.

예제1

  1. 예제 1

    입력
    3
    2 1 0111
    4 2 1000000000000000
    5 3 00000000000000000000000000000001
    
    예상 출력
    2
    6
    0