잠금 패턴과 스패닝 트리
시간 제한1초메모리 제한128 MB
킹 이동이 가능한 m×m 격자(m은 2 이상 6 이하)의 스패닝 트리 개수를 라플라시안 여인자로 구합니다.
문제
안드로이드는 스마트폰을 잠글 때 패턴을 쓴다. 흔히 쓰는 잠금 패턴은 3×3 그리드에 노드 9개로 이루어져 있다. 상현이는 보안을 더 높이려고 다음과 같은 잠금 패턴을 제공하는 앱을 만들려고 한다.
상현이가 만들 앱의 잠금 패턴은 크기가 2×2부터 까지 다양하고, 인접한 노드끼리만 연결할 수 있다. 인접한 노드란 가로, 세로, 대각선 방향으로 바로 옆에 있는 노드를 말한다. 그래서 네 꼭짓점에 있는 노드는 3개와 연결되고, 나머지 노드는 많으면 8개와 연결된다.
잠금 패턴은 항상 스패닝 트리를 이루어야 한다. 스패닝 트리는 그래프의 간선을 모은 집합으로, 닫힌 루프를 포함하지 않는다. 또 임의의 두 노드 사이에 경로가 있어야 하고, 개의 정점과 개의 간선으로 이루어진다. 잠금 패턴 하나에서 스패닝 트리는 여러 가지가 나올 수 있다.
그래프 의 스패닝 트리 개수를 구하려면 먼저 모든 정점에 처럼 번호를 붙인다. 그다음 행렬 를 이렇게 만든다.
- 이면 는 에 연결된 간선의 개수
- 이면 와 사이에 간선이 있으면 , 없으면
스패닝 트리 개수는 의 여인자로 구한다.
여기서 는 에서 행과 열을 지워 얻은 행렬의 행렬식이다. 와 를 어떻게 골라도 의 여인자는 모두 같은 값이다.
예를 들어 2×2 패턴의 행렬 는 다음과 같다.
, 로 두고 여인자를 구하면 다음과 같다.
따라서 2×2 패턴의 스패닝 트리는 16개다.
3×3 패턴의 행렬 는 다음과 같다.
이 행렬의 여인자 값이 3×3 패턴의 스패닝 트리 개수다.
패턴에서 만들 수 있는 스패닝 트리의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 ()이 주어진다. 다음 개 줄에는 테스트 케이스마다 패턴의 크기 이 한 줄에 하나씩 주어진다. ()
출력
각 테스트 케이스마다 패턴에서 만들 수 있는 스패닝 트리의 개수를 한 줄에 하나씩 출력한다.
힌트
인 패턴은 정점 4개가 서로 모두 연결된 그래프이고, 스패닝 트리는 16가지다.