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

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

잔인한 빙고

시간 제한8초메모리 제한512 MB

요약
N×N 빙고 카드에서 미리 표시된 칸이 최대 8개 주어질 때, 가로, 세로, 대각선이 완성되지 않으면서 표시되지 않은 칸이 정확히 N개가 되는 경우의 수를 10007로 나눈 나머지로 구한다.
난이도

어려움10점 중 8점

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

문제

빙고는 여러 명의 플레이어와 한 명의 진행자가 함께하는 파티 게임이다. 각 플레이어는 N × N 격자에 N2개의 서로 다른 숫자가 적힌 빙고 카드를 받는다(보통 N = 5). 게임이 진행되는 동안 진행자는 추첨기에서 숫자를 하나씩 뽑는다. 숫자가 뽑힐 때마다 플레이어는 카드에 그 숫자가 있으면 해당 칸을 표시한다. 플레이어의 목표는 가로, 세로, 대각선 중 한 줄에 있는 N개의 칸을 모두 표시한 뒤 "빙고!"를 외치는 것이다. 가장 먼저 "빙고!"를 외친 플레이어가 게임에서 이긴다.

아주 불운한 경우, 카드에 표시되지 않은 칸이 정확히 N개 있거나, 표시된 칸이 N(N-1)개 있으면서 빙고 줄이 하나도 없을 수 있다. 이 문제에서 여러분이 할 일은, 표시된 칸이 0개 이상 있는 초기 상태가 주어졌을 때 그러한 패턴이 몇 가지 가능한지 세는 프로그램을 작성하는 것이다.

입력

입력은 다음과 같은 형식으로 주어진다.

N K
x1 y1
.
.
.
xK yK

첫 줄에는 빙고 카드의 크기 N (1 ≤ N ≤ 32)과 초기 상태에서 표시된 칸의 수 K (0 ≤ K ≤ 8)가 주어진다. 이어서 K개의 줄이 주어지며, 각 줄에는 좌표 (xi, yi)에 있는 칸이 표시되었음을 나타내는 두 수 xi와 yi가 있다. 좌표는 0부터 시작한다(즉, 0 ≤ xi, yi ≤ N - 1). 표시된 두 칸이 같은 경우는 없다.

출력

주어진 초기 상태에서 만들 수 있는, 표시되지 않은 칸이 정확히 N개인 빙고가 아닌 패턴의 수를 10007로 나눈 나머지를 한 줄에 출력한다(수가 매우 클 수 있기 때문이다). 회전하거나 뒤집은 패턴은 서로 다른 것으로 보고 각각 센다.

예제3

  1. 예제 1

    입력
    4 2
    0 2
    3 1
    
    예상 출력
    6
    
  2. 예제 2

    입력
    4 2
    2 3
    3 2
    
    예상 출력
    6
    
  3. 예제 3

    입력
    10 3
    0 0
    4 4
    1 4
    
    예상 출력
    1127