만드는 중입니다

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

Introversion

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

요약
2n개의 칸 중 일부에 요리가 놓여 있을 때, 빈칸을 채워 같은 종류가 인접하지 않도록 하는 방법의 수를 10^9+7로 나눈 나머지로 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 구현
정답자
아직 제출이 없습니다

문제

당신은 Taste Of Pacific Cuisine(TOPC)이라는 식당을 운영합니다. 이번 주말에 많은 손님을 맞는 큰 연회가 열립니다. 주방장은 nn가지 종류의 요리를 만들었습니다. 모든 손님이 각 종류를 맛볼 수 있도록, 종류마다 두 접시씩 준비하려고 합니다. 연회에 나오는 요리는 모두 2n2n접시입니다.

테이블은 매우 길어서 2n2n접시가 한 줄에 정확히 들어갑니다. 모든 요리를 한 번에 한 줄로 차려 놓을 예정입니다. 같은 종류의 요리 두 접시는 서로 인접하면 안 됩니다. 그래야 돌아다니기 싫어하는 내향적인 손님도 가까이에서 고를 수 있습니다.

이미 테이블에 놓인 요리가 있습니다. 같은 종류의 두 접시가 인접하지 않도록 남은 요리를 놓는 방법의 수를 세어 주세요. 이를 intro version이라고 부릅니다. 경우의 수가 클 수 있으므로 109+710^9+7로 나눈 나머지를 출력합니다.

입력

첫 줄에 테스트 케이스의 수 TT가 주어집니다. 각 테스트 케이스는 정수 nn으로 시작합니다. 다음 줄에는 공백으로 구분된 2n2n개의 정수 x1,x2,⋯ ,x2nx_1, x_2, \cdots, x_{2n}이 주어집니다. xi=0x_i=0이면 테이블의 ii번째 자리는 비어 있습니다. 그렇지 않으면 xix_i는 1부터 nn까지의 정수이며 요리의 종류를 나타냅니다. 각 종류 k∈{1,2,…,n}k \in \{1,2,\dots,n\}은 입력에 최대 두 번 나타난다는 것이 보장됩니다. 한 종류가 두 번 나타나면 두 위치는 인접하지 않습니다.

출력

각 테스트 케이스에 대해, 남은 요리를 모두 놓는 유효한 방법의 수를 109+710^9+7로 나눈 나머지로 출력합니다.

제한

1≤T≤201 \le T \le 20

2≤n≤1002 \le n \le 100

0≤xi≤n0 \le x_i \le n

예제1

  1. 예제 1

    입력
    3
    2
    1 2 0 0
    2
    1 0 2 0
    5
    0 0 0 0 0 1 2 3 4 5
    
    예상 출력
    1
    0
    96