마방진은 크기의 정사각형 칸에 개의 수를 한 칸에 하나씩 배열하여, 가로, 세로, 가장 긴 두 대각선 방향의 합이 모두 같게 만든 것이다. 예를 들어, 아래 그림은 크기의 마방진의 예시를 보여준다.

개의 수들이 주어질 때, 이 수들을 한 번씩 사용하여 만들 수 있는 크기의 서로 다른 마방진은 모두 몇 개인지 구하는 프로그램을 작성하시오.
이고 개의 수가 로 주어진 예를 생각해보자. 아래와 같이 총 가지 마방진을 만들 수 있음을 알 수 있다.
- 이 문제에서 처음 주어진 마방진은 주어진 입력으로 만들 수 있는 마방진 중 하나이다.
- 처음 주어진 마방진을 시계 방향으로 도 회전하면 다음과 같이 또다른 마방진을 만들 수 있다.

- 시계 방향으로 도, 도 회전해도 또다른 마방진을 만들 수 있다.
- 마지막으로, 위에서 만든 마방진을 좌우로 뒤집어도 새로운 마방진을 만들 수 있다. 예를 들어 아래의 마방진은 처음 마방진을 좌우로 뒤집은 것이다.

입력 형식
첫 줄에 마방진의 크기를 나타내는 정수 이 주어진다.
그다음 줄에 마방진에 사용할 개의 정수가 공백으로 구분되어 주어진다. 이 수들은 모두 이상 이하이다.
출력 형식
첫 줄에 만들 수 있는 서로 다른 마방진의 수를 출력한다.
예제 1
입력
3 9 8 7 6 5 4 3 2 1
출력
8
예제 2
입력
2 1 0 1 0
출력
0
예제 3
입력
4 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
출력
256
예제 4
입력
3 0 0 0 0 0 0 0 0 0
출력
1
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 3점
종류 2: 16점
종류 3: 54점
종류 4: 18점
주어진 개의 수는 각각 또는 이다.
종류 5: 9점
모든 입력 케이스가 주어진다.
해설
일 때는 의 완전 탐색으로도 제한 시간 내에 해결할 수 있습니다. 그러나 인 경우에는 이 너무 커 비효율적이므로, 탐색 범위를 줄이는 아이디어가 필요합니다.
16개의 칸 중 (0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,1), (2,2) 의 8개 칸만 값을 정하면, 나머지 8칸의 값은 자동으로 결정됩니다. 따라서 실제로 탐색해야 할 경우의 수는 정도로 줄어들며, 여기에 적절한 가지치기와 최적화를 적용하면 제한 시간 내에 문제를 해결할 수 있습니다.