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

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

돌아온 블록

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

요약
2×n 판의 빈 칸에 남은 블록을 채워 모든 행과 열이 증가하도록 만드는 경우의 수를 구한다.
난이도

보통10점 중 7점

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

문제

바이타자르는 컴퓨터 프로그램의 도움을 받아 nn개의 서랍 사이에서 kk개의 블록을 옮기는 방법을 완벽하게 익혔다. 그런데 같은 재주를 부릴 수 있는 사람이 많다는 사실을 알게 되었고, 바이톨리나의 관심을 끌기 위해 더 복잡한 묘기를 고안해야 한다.

이번에 바이타자르에게는 1,2,…,2n1, 2, \ldots, 2n으로 번호가 매겨진 2n2n개의 블록과 크기가 2×n2 \times n인 판이 있다. 그는 일부 블록을 판 위에 한 칸에 하나씩 올려 둔다. 이제 남은 블록들을 빈 칸에 배치하는 방법이 몇 가지인지 궁금하다. 단, 모든 행과 모든 열에서 블록 번호가 증가하는 순서로 놓여야 한다.

다음을 수행하는 프로그램을 작성하시오.

  • 표준 입력에서 판의 크기와 이미 놓여 있는 블록의 배치를 읽는다.
  • 남은 블록들을 배치하는 방법의 수를 구한다.
  • 그 결과를 표준 출력에 출력한다.

입력

첫째 줄에 정수 nn (1≤n≤10001 \le n \le 1000)이 주어진다. 이어지는 두 줄은 판의 상태를 나타내며, 각 줄에는 nn개의 정수 aia_i (0≤ai≤2n0 \le a_i \le 2n)가 공백으로 구분되어 주어진다. 첫 번째 줄은 판의 윗줄, 두 번째 줄은 아랫줄에 해당한다. 00은 그 칸이 비어 있음을, 양수는 그 칸에 놓인 블록의 번호를 뜻한다. 각 블록은 판 위에 최대 한 번만 놓여 있다.

출력

남은 블록들을 판에 배치하는 방법의 수를 정수 하나로 출력한다. 블록 번호는 모든 행에서 왼쪽에서 오른쪽으로, 모든 열에서 위에서 아래로 증가해야 한다.

예제3

  1. 예제 1

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

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

    입력
    2
    0 0
    0 0
    
    예상 출력
    2