돌아온 블록

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

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

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

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

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

입력

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

출력

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