만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

새로운 AVL 트리 만들기

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

요약
집합 S와 높이 h가 주어지면, 리프가 아닌 모든 노드의 균형값이 S에 속하는 높이 h인 트리 모양의 개수를 10^9+7로 나눈 나머지를 구합니다.
난이도

보통10점 중 5점

유형
트리, 동적 계획법
정답자
아직 제출이 없습니다

문제

AVL 트리는 이를 만든 Adelson-Velsky와 Landis의 이름을 딴 트리이다.

AVL 트리를 정의하기 위해 먼저 노드마다 "균형값"을 정의한다. 어떤 노드의 균형값은 왼쪽 서브트리의 높이를 hlh_l, 오른쪽 서브트리의 높이를 hrh_r이라고 할 때 hr−hlh_r-h_l이다. 왼쪽 또는 오른쪽 자식이 없으면 해당 방향 서브트리의 높이는 00으로 본다. 원래 AVL 트리는 모든 노드의 균형값이 −1-1, 00, 11 중 하나이다.

MatKor 자료구조 세미나를 들은 민재는 자신의 이름을 넣어 AVLM 트리를 개발하려고 한다. 민재는 노드의 균형값으로 −1-1, 00, 11 중 일부만 허용하고자 한다. 그래서 {−1,0,1}\{-1,0,1\}의 공집합이 아닌 부분집합 SS를 정하고, 리프 노드를 제외한 모든 노드의 균형값이 SS의 원소 중 하나인 트리를 AVLM 트리라고 정의했다. 리프 노드의 균형값은 반드시 00이므로 리프 노드는 이 조건에서 예외로 둔다.

집합 SS와 AVLM 트리의 높이 hh가 주어졌을 때, 높이가 hh인 AVLM 트리의 모양이 몇 가지인지 구하라.

노드 하나만 있는 트리의 높이는 11이다.

입력

첫 번째 줄에 테스트 케이스의 개수 TT가 주어진다. (1≤T≤1061\le T\le 10^6)

각 테스트 케이스는 두 줄로 주어진다. 첫 번째 줄에는 높이 hh와 SS의 원소의 개수 ∣S∣\lvert S \rvert가 공백으로 구분되어 주어진다. (1≤h≤1061\le h\le 10^6, 1≤∣S∣≤31\le\lvert S \rvert\le 3)

두 번째 줄에는 노드별로 가능한 균형값인 SS의 서로 다른 원소 ∣S∣\lvert S \rvert개가 오름차순으로 주어진다.

SS는 {−1}\{-1\}, {0}\{0\}, {1}\{1\}, {−1,0}\{-1,0\}, {−1,1}\{-1,1\}, {0,1}\{0,1\}, {−1,0,1}\{-1,0,1\} 중 하나이다.

같은 테스트 케이스는 여러 번 주어지지 않는다.

출력

각 테스트 케이스마다 답을 109+710^9+7로 나눈 나머지를 한 줄에 하나씩 출력한다.

힌트

입력이 많은 경우 빠른 입출력을 사용하지 않으면 시간 초과가 나올 수 있다.

예제1

  1. 예제 1

    입력
    6
    1 1
    1
    2 1
    -1
    3 2
    -1 1
    3 3
    -1 0 1
    5 3
    -1 0 1
    1000000 3
    -1 0 1
    
    예상 출력
    1
    1
    4
    15
    108675
    431215210