돌아온 블록
시간 제한1초메모리 제한128 MB
2×n 판의 빈 칸에 남은 블록을 채워 모든 행과 열이 증가하도록 만드는 경우의 수를 구한다.
문제
바이타자르는 컴퓨터 프로그램의 도움을 받아 개의 서랍 사이에서 개의 블록을 옮기는 방법을 완벽하게 익혔다. 그런데 같은 재주를 부릴 수 있는 사람이 많다는 사실을 알게 되었고, 바이톨리나의 관심을 끌기 위해 더 복잡한 묘기를 고안해야 한다.
이번에 바이타자르에게는 으로 번호가 매겨진 개의 블록과 크기가 인 판이 있다. 그는 일부 블록을 판 위에 한 칸에 하나씩 올려 둔다. 이제 남은 블록들을 빈 칸에 배치하는 방법이 몇 가지인지 궁금하다. 단, 모든 행과 모든 열에서 블록 번호가 증가하는 순서로 놓여야 한다.
다음을 수행하는 프로그램을 작성하시오.
- 표준 입력에서 판의 크기와 이미 놓여 있는 블록의 배치를 읽는다.
- 남은 블록들을 배치하는 방법의 수를 구한다.
- 그 결과를 표준 출력에 출력한다.
입력
첫째 줄에 정수 ()이 주어진다. 이어지는 두 줄은 판의 상태를 나타내며, 각 줄에는 개의 정수 ()가 공백으로 구분되어 주어진다. 첫 번째 줄은 판의 윗줄, 두 번째 줄은 아랫줄에 해당한다. 은 그 칸이 비어 있음을, 양수는 그 칸에 놓인 블록의 번호를 뜻한다. 각 블록은 판 위에 최대 한 번만 놓여 있다.
출력
남은 블록들을 판에 배치하는 방법의 수를 정수 하나로 출력한다. 블록 번호는 모든 행에서 왼쪽에서 오른쪽으로, 모든 열에서 위에서 아래로 증가해야 한다.