만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

프뤼프줌메

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

요약
주어진 n과 m에 대해 한 자리 변경이나 인접한 서로 다른 두 수의 교환을 모두 검출하는 검사합 행렬 p와 q를 만들고, 없으면 그 사실을 출력합니다.
난이도

어려움10점 중 8점

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

입력과 문제

우리 주변에는 은행 계좌 번호, 도서 ISBN, 상품 바코드처럼 긴 숫자 식별자가 많다. 이런 식별자는 사람이 직접 적거나 입력하는 경우가 많아서, 실수를 막으려고 오류 검출 기능이 내장되어 있는 경우가 많다.

오류 검출은 보통 체크섬의 형태로 이루어진다. 예를 들어 ISBN-10 코드는 다음 체크섬을 가지는 10자리 숫자열 a1,a2,…,a10a_1, a_2, \dots, a_{10}이다.

10×a1+9×a2+8×a3+⋯+2×a9+1×a10(mod11)10 \times a_1 + 9 \times a_2 + 8 \times a_3 + \dots + 2 \times a_9 + 1 \times a_{10} \pmod{11}

체크섬은 0부터 10 사이의 수이며, 올바른 도서 코드에서는 항상 0이다. 이 체크섬은 오류 검출을 위해 설계되었고 다음 두 성질을 가진다.

  1. 한 자리 숫자만 바꾸고 나머지는 그대로 두면 체크섬이 달라진다.
  2. 서로 다른 인접한 두 자리 숫자를 맞바꾸고 나머지는 그대로 두면 체크섬이 달라진다.

다만 체크섬은 11가지 값을 가질 수 있는 반면 각 자리 숫자는 10가지 값만 가지므로, 다소 과하다고 볼 수 있다.

우리는 다음과 같이 아름다운 체크섬을 정의한다. 식별자는 각 값이 0 이상 m−1m-1 이하인 정수 nn개로 이루어진 수열 a1,a2,…,ana_1, a_2, \dots, a_n이다. 체크섬 알고리즘은 두 행렬 pijp_{ij} (0≤i,j≤m−10 \le i, j \le m-1)와 qkiq_{ki} (1≤k≤n1 \le k \le n, 0≤i≤m−10 \le i \le m-1)로 정해지며, 두 행렬의 모든 값은 0 이상 m−1m-1 이하이다. 체크섬은 다음 순서로 계산한다.

  1. s0=0s_0 = 0으로 둔다.
  2. kk를 1부터 nn까지 증가시키며 다음을 수행한다.
    1. tk=qk,akt_k = q_{k,a_k}로 둔다.
    2. sk=psk−1,tks_k = p_{s_{k-1},t_k}로 둔다.
  3. sns_n을 체크섬으로 반환한다.

즉, 행렬 qq는 각 위치마다 수를 변환하고, 행렬 pp는 변환된 수들을 결합하는 규칙을 정한다. 주어진 nn과 mm에 대해 두 행렬 pp와 qq가 임의의 수열 aa마다 위의 두 성질을 만족하는 체크섬을 이루면, 이를 아름다운 체크섬이라고 한다. 즉 하나의 수를 바꾸면 체크섬이 바뀌어야 하고, 서로 다른 인접한 두 수(ak≠ak+1a_k \ne a_{k+1}인 어떤 kk가 존재한다)를 맞바꾸어도 체크섬이 바뀌어야 한다.

예를 들어 pij=i+j(mod11)p_{ij} = i + j \pmod{11}, qki=(11−k)×i(mod11)q_{ki} = (11 - k) \times i \pmod{11}로 정의한 ISBN-10 방식은 n=10n=10, m=11m=11일 때 아름다운 체크섬이다.

주어진 nn과 mm에 대해 아름다운 체크섬을 만들 수 있는지 구하시오.

출력

아름다운 체크섬이 존재하면 첫 줄에 Ja를 출력한다. 존재하지 않으면 Nein을 출력한다.

Ja를 출력한 경우, 체크섬의 내용을 이어서 출력한다. 다음 mm줄에는 행렬 pp를 출력한다. 각 줄에는 mm개의 정수를 공백으로 구분하여 쓴다. ii번째 줄(0부터 시작)의 jj번째(0부터 시작) 값이 pijp_{ij}이다. 그 다음 nn줄에는 행렬 qq를 출력한다. 각 줄에는 mm개의 정수를 공백으로 구분하여 쓴다. kk번째 줄(1부터 시작)의 ii번째(0부터 시작) 값이 qkiq_{ki}이다.

출력하는 모든 수는 0 이상 m−1m-1 이하여야 한다. 해가 여러 개이면 아무거나 출력해도 된다.

예제1

  1. 예제 1

    입력
    4 3
    
    예상 출력
    Ja
    0 1 2
    1 2 0
    2 0 1
    0 1 2
    0 2 1
    0 1 2
    0 2 1