소수방진

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

문제

소수방진은 5×5 격자의 각 칸에 한 자리 숫자를 채운 것으로, 다음을 모두 만족한다: 다섯 개의 행(각각 왼쪽에서 오른쪽으로 읽음), 다섯 개의 열(각각 위에서 아래로 읽음), 그리고 두 대각선(둘 다 왼쪽에서 오른쪽으로, 즉 열 번호가 커지는 방향으로 읽음)이 모두 다섯 자리 소수가 되어야 한다. 주대각선은 왼쪽 위 칸에서 오른쪽 아래 칸으로, 반대각선은 왼쪽 아래 칸에서 오른쪽 위 칸으로 읽는다.

예를 들어 아래 격자는 하나의 소수방진이다.

1 1 3 5 1
3 3 2 0 3
3 0 3 2 3
1 4 0 3 3
3 3 3 1 1

우리는 다음 조건을 모두 만족하는 소수방진을 찾으려 한다.

  • 행·열·대각선에서 나오는 모든 소수(총 12개)의 각 자리 숫자의 합이 서로 같아야 하며, 그 합은 입력으로 주어진다. (위 그림에서는 11이다.)
  • 가장 왼쪽 위 칸(1행 1열)에 들어갈 숫자는 입력으로 미리 주어진다. (위 그림에서는 1이다.)
  • 같은 소수가 한 소수방진 안에서 두 번 이상 나타나도 된다.
  • 0으로 시작하는 다섯 글자는 다섯 자리 소수로 보지 않는다. 예를 들어 00003은 다섯 자리 소수가 아니다.

조건을 만족하는 소수방진을 모두 구한다.

입력

첫째 줄에 모든 소수가 가져야 하는 각 자리 숫자의 합이 주어진다.

둘째 줄에 소수방진의 가장 왼쪽 위 칸에 들어갈 숫자가 주어진다.

출력

조건을 만족하는 모든 소수방진을 출력한다. 각 소수방진은 5줄에 걸쳐 한 줄에 5글자씩 출력하고, 서로 다른 소수방진 사이에는 빈 줄을 하나 넣는다.

소수방진이 여러 개이면, 각 소수방진을 첫 행부터 마지막 행까지 이어 붙인 25글자 문자열을 기준으로 사전순 오름차순으로 정렬하여 출력한다. 조건을 만족하는 소수방진이 하나도 없으면 아무것도 출력하지 않는다.