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

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

Primonimo

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

요약
소수 p에 대해 행과 열을 증가시켜 모든 칸을 p로 만드는 횟수를 구하고, 사전순으로 가장 작은 해를 출력한다.
난이도

어려움10점 중 8점

유형
수학, 정수론, 그리디, 구현
정답자
아직 제출이 없습니다

문제

Primonimo는 n×mn \times m 격자판에서 하는 게임이다. 각 칸에는 11 이상 pp 이하의 정수가 적혀 있고, pp는 소수다. 한 번의 수는 칸 하나를 고르는 것이고, 고른 칸과 같은 행에 있거나 같은 열에 있는 모든 칸의 수가 11씩 커진다. 고른 칸은 그 행과 그 열에 모두 속하지만 11만 커진다. pp가 적혀 있던 칸은 11로 돌아간다.

모든 칸이 pp가 되면 게임을 이긴다. 처음 판이 주어질 때 게임을 이기는 수열을 찾아라.

칸에는 행 우선 순서로 11부터 nmnm까지 번호를 붙인다. ii행 jj열(둘 다 1부터 센다)에 있는 칸의 번호는 (i−1)m+j(i-1)m + j다.

입력

입력은 테스트 케이스 하나로 이루어진다. 첫 줄에 정수 세 개 nn, mm, pp가 주어진다. nn은 행의 개수(1≤n≤201 \le n \le 20), mm은 열의 개수(1≤m≤201 \le m \le 20), pp는 소수(2≤p≤972 \le p \le 97)다. 다음 nn개 줄에는 각각 11 이상 pp 이하의 정수가 mm개씩 주어진다.

출력

이기는 수열이 없으면 −1-1을 출력한다.

있으면 다음 규칙으로 답을 하나로 정한다. 고르는 순서는 결과를 바꾸지 않으므로 각 칸을 몇 번 골랐는지만 따지면 된다. 칸 tt를 고른 횟수를 xtx_t라 하고, 0≤xt≤p−10 \le x_t \le p-1인 횟수 벡터만 생각한다. 이기는 횟수 벡터가 여럿이면 사전순으로 가장 작은 (x1,x2,…,xnm)(x_1, x_2, \ldots, x_{nm})을 고른다. 즉 x1x_1이 가장 작은 것을 고르고, 그런 것이 여럿이면 x2x_2가 가장 작은 것을 고르는 식이다.

첫 줄에 k=x1+⋯+xnmk = x_1 + \cdots + x_{nm}을 출력한다. 둘째 줄에 고른 칸 번호 kk개를 번호가 작은 것부터 출력하되, 번호 tt는 xtx_t번 반복해서 적는다. k=0k = 0이면 둘째 줄은 비운다. 이렇게 정한 kk는 항상 p⋅n⋅mp \cdot n \cdot m 이하다.

예제4

  1. 예제 1

    입력
    4 5 5
    2 1 1 1 2
    5 3 4 4 3
    4 3 3 3 2
    3 1 3 3 1
    
    예상 출력
    6
    2 5 5 12 18 19
    
  2. 예제 2

    입력
    3 3 3
    3 1 1
    1 3 2
    3 2 3
    
    예상 출력
    13
    1 1 2 2 3 3 4 5 5 6 7 7 9
    
  3. 예제 3

    입력
    3 2 2
    1 2
    2 1
    1 2
    
    예상 출력
    -1
    
  4. 예제 4

    입력
    3 2 2
    2 1
    2 1
    1 1
    
    예상 출력
    1
    6