아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

XOR 수열

시간 제한2초메모리 제한512 MB

요약
2^m개의 질의 값 각각에 대해 XOR이 최대가 되는 번호를 정한 배열이 주어질 때, 이를 만들어 내는 서로 다른 m비트 정수 n개의 순서 있는 배열의 개수를 10^9+7로 나눈 나머지로 센다.
난이도

어려움10점 중 9점

유형
비트 연산, 분할 정복, 조합론, 트리
정답자
아직 제출이 없습니다

문제

두 정수 mm과 nn이 주어진다. 또한 nn개의 서로 다른 정수 x1,x2,…,xnx_1, x_2, \ldots, x_n이 주어지며, 0≤xi≤2m−10 \le x_i \le 2^m - 1이다. 각 yy (0≤y≤2m−10 \le y \le 2^m - 1)에 대해, xpyx_{p_y}가 yy와 비트별 XOR을 했을 때 최댓값을 갖도록 하는 pyp_y를 찾았다. 즉, 모든 i=1,…,ni = 1, \ldots, n (i≠pyi \ne p_y)에 대해 y⊕xpy>y⊕xiy \oplus x_{p_y} > y \oplus x_i이다 (⊕\oplus는 비트별 XOR을 나타낸다).

이제 반대 문제를 생각하자. mm, nn, 그리고 수열 p0,p1,…,p2m−1p_0, p_1, \ldots, p_{2^m - 1}이 주어졌을 때, 위 알고리즘으로 이 pp 수열을 만들어낼 수 있는 서로 다른 정수 수열 x1,x2,…,xnx_1, x_2, \ldots, x_n의 개수를 세라. 두 xx 수열이 다르다는 것은, 어떤 ii에 대해 한 수열의 xix_i가 다른 수열의 xix_i와 다른 경우를 말한다. 이 개수를 109+710^9 + 7로 나눈 나머지를 출력하라.

입력

각 테스트 케이스의 첫 줄에는 두 정수 mm (0≤m≤160 \le m \le 16)과 nn (1≤n≤2m1 \le n \le 2^m)이 공백으로 구분되어 주어진다. 2m2^m은 pp 수열의 길이이고, nn은 xx 수열의 길이이다. 다음 2m2^m개의 줄에는 각각 하나의 정수 pp (1≤p≤n1 \le p \le n)가 주어진다. 이는 수열 p0,p1,…,p2m−1p_0, p_1, \ldots, p_{2^m - 1}의 값들이다. 11부터 nn까지의 모든 값이 적어도 한 번씩 나타난다.

출력

위 알고리즘으로 수열 p0,p1,…,p2m−1p_0, p_1, \ldots, p_{2^m - 1}을 만들어낼 수 있는 수열 x1,x2,…,xnx_1, x_2, \ldots, x_n의 개수를 109+710^9 + 7로 나눈 나머지를 한 줄에 출력한다.

예제3

  1. 예제 1

    입력
    3 6
    1
    1
    2
    2
    3
    4
    5
    6
    
    예상 출력
    4
    
  2. 예제 2

    입력
    2 3
    1
    2
    1
    3
    
    예상 출력
    0
    
  3. 예제 3

    입력
    3 8
    1
    2
    3
    4
    5
    6
    7
    8
    
    예상 출력
    1