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

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

소수방진

시간 제한1초메모리 제한128 MB

요약
5×5 격자에서 다섯 행, 다섯 열, 두 대각선이 모두 다섯 자리 소수가 되고, 그 소수들의 자릿수 합이 입력으로 주어진 값과 같으며 왼쪽 위 칸의 숫자가 고정된 격자를 모두 찾아 사전순으로 출력한다.
난이도

어려움10점 중 8점

유형
백트래킹, 정수론, 완전 탐색, 확률
정답자
아직 제출이 없습니다

문제

소수방진은 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글자 문자열을 기준으로 사전순 오름차순으로 정렬하여 출력한다. 조건을 만족하는 소수방진이 하나도 없으면 아무것도 출력하지 않는다.

예제3

  1. 예제 1

    입력
    11
    1
    
    예상 출력
    11351
    14033
    30323
    53201
    13313
    
    11351
    33203
    30323
    14033
    33311
    
    13313
    13043
    32303
    50231
    13331
    
  2. 예제 2

    입력
    11
    2
    
    예상 출력
    25121
    10271
    54101
    21611
    11117
    
  3. 예제 3

    입력
    11
    3
    
    예상 출력
    35111
    50033
    10343
    13421
    13313