언트위스트하기

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

요약
키와 뒤틀린 암호문이 주어지면 뒤틀기 식을 거꾸로 풀어 원래 평문을 복원한다.
난이도

쉬움10점 중 3점

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

문제

암호학은 메시지(평문, plaintext)를 겉으로는 알아볼 수 없는 형태(암호문, ciphertext)로 바꾸어, 의도된 수신자를 제외하면 암호문을 보더라도 평문을 알아낼 수 없게 만드는 비밀 통신 기법을 연구한다. 평문을 암호문으로 바꾸는 과정을 암호화(encryption), 암호문을 평문으로 되돌리는 과정을 복호화(decryption)라고 한다. 트위스팅(twisting)은 송신자와 수신자가 미리 양의 정수인 비밀 키 kk를 공유해야 하는 간단한 암호화 방법이다.

트위스팅은 길이가 nn인 네 개의 배열을 사용하며, 여기서 nn은 메시지의 길이이다. plaintext와 ciphertext는 문자 배열이고, plaincode와 ciphercode는 정수 배열이다. 모든 배열은 0부터 시작하므로 원소의 번호는 00부터 n−1n-1까지이다. 모든 메시지는 소문자, 마침표, 그리고 공백을 나타내는 밑줄만으로 이루어진다.

키 kk가 주어졌을 때 암호화는 다음과 같이 진행된다. 먼저 plaintext의 각 문자를 다음 규칙에 따라 plaincode의 정수로 변환한다.

_ = 0, a = 1, b = 2, …, z = 26, . = 27.

다음으로 plaincode로부터 ciphercode의 각 원소를 계산한다. 즉, 00부터 n−1n-1까지의 모든 ii에 대해

ciphercode[i]=(plaincode[ki mod n]−i) mod 28.\text{ciphercode}[i] = (\text{plaincode}[k i \bmod n] - i) \bmod 28.

여기서 x mod yx \bmod y는 xx를 yy로 나눈 음이 아닌 나머지이다 (예: 3 mod 7=33 \bmod 7 = 3, 22 mod 8=622 \bmod 8 = 6, −1 mod 28=27-1 \bmod 28 = 27). 마지막으로 ciphercode의 정수들을 위와 같은 규칙으로 다시 문자로 바꾸면 ciphertext가 되고, 이것이 트위스팅된 메시지이다.

예를 들어 키 55로 cat을 트위스팅하면 다음과 같다.

배열012
plaintextcat
plaincode3120
ciphercode31927
ciphertextcs.

당신이 할 일은 메시지를 언트위스트(untwist)하는 것이다. 즉, 키 kk가 주어졌을 때 암호문으로부터 원래 평문을 복원해야 한다. 예를 들어 키 55와 암호문 cs.가 주어지면 프로그램은 평문 cat을 출력해야 한다.

입력

입력은 하나 이상의 테스트 케이스로 이루어지며, 마지막에는 숫자 00 하나만 있는 줄이 와서 입력의 끝을 나타낸다. 각 테스트 케이스는 한 줄에 주어지며, 키 kk, 공백 하나, 그리고 11자 이상 7070자 이하의 트위스팅된 메시지로 구성된다. 키 kk는 300300 이하의 양의 정수이다.

메시지를 언트위스트한 결과는 항상 유일하다고 가정해도 된다. (정수론에 익숙한 독자를 위해: 이는 키 kk와 길이 nn의 최대공약수가 11일 때 성립하며, 모든 테스트 케이스에서 그러함이 보장된다.)

출력

각 테스트 케이스에 대해 언트위스트된 메시지를 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    5 cs.
    101 thqqxw.lui.qswer
    3 b_ylxmhzjsys.virpbkr
    0
    
    예상 출력
    cat
    this_is_a_secret
    beware._dogs_barking