Tales from DeCrypt

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

문제

뉴스그룹, 메일링 리스트를 비롯한 여러 공개 게시판에서는 내용을 완전히 감추지 않으면서 가리기 위한 방법으로 ROT13 암호가 널리 쓰인다. 알파벳 문자를 13칸씩(26을 법으로) 회전시키는 방식이라, 똑같은 절차로 암호화와 복호화가 모두 이루어진다. 일부 독자에게 불쾌할 수 있는 글을 일부러 ROT13 형태로 올려 두고, 굳이 평문으로 되돌려 읽은 독자가 그 내용에 대한 책임을 지도록 하려는 것이다.

회전 암호는 단순히 가리는 데 그치지 않고 정보를 실제로 감추는 데에도 쓸 수 있다. 아래에 설명하는 암호화 방식에 대한 복호화 프로그램을 작성하라.

이 방식은 7비트 출력 가능 ASCII 문자, 즉 0x20(공백)부터 0x7e(~)까지의 95개 문자에만 적용된다. 이 범위를 벗어나는 바이트는 그대로 출력으로 통과시키므로, 암호문도 여전히 일반 텍스트로 저장하고 전송할 수 있다.

난수 생성기. 세 정수가 선형 합동 생성기를 구동한다. 곱수 a, 모듈러스 m, 그리고 호출마다 갱신되는 시드 s이다.

double r(int a, int m, int &s):   // s는 호출 사이에 계속 유지된다
    double val = (s mod m) / double(m)
    s = (a * s + 1) mod m
    return val

곱수, 모듈러스, 초기 시드는 첫 줄에 a m s 순서로 공백으로 구분된 세 정수로 주어지며, 각 값은 $2 \le a, m, s \le 65536$을 만족한다. 예를 들어 첫 줄이 12343 65536 11이면 a = 12343, m = 65536, s = 11이다.

암호화. 암호문은 문자 단위로 생성된다.

입력 스트림의 각 문자 c에 대해:
    c가 0x20 .. 0x7e 범위 밖이면:
        c를 그대로 출력한다
    그렇지 않으면:
        c = ((c - 32) + ceil(95 - r(a, m, s) * 95)) mod 95 + 32
        c를 출력한다

출력 가능한 문자는 항상 또 다른 출력 가능한 문자로 대응되며, 난수 생성기는 출력 가능한 문자를 처리할 때에만 한 단계 나아간다. 원래 문장을 복원하라.

입력

입력은 암호화 프로그램이 만들어 낸 결과 그 자체이다. 첫 줄에는 공백으로 구분된 세 정수 a, m, s가 있다. 암호문은 다음 줄부터 시작해 파일 끝까지 이어지며, 그 안에 들어 있는 개행 같은 출력 불가능한 바이트는 암호화 단계에서 그대로 통과된 것이다.

출력

입력에 담긴 암호문을 복호화한 결과를 출력하라.