密碼學 (Cryptography) 是一套關於如何將訊息 (又稱為明文 (plaintext)) 轉換成暗號 (又稱為密文 (ciphertext)) 的秘密通訊方法,除非你是接收者,否則沒有人可以從密文中找出原本的明文。而將明文轉換成密文的過程,我們稱為加密 (encryption);反之,把密文轉成明文的過程被稱為解密 (decryption)。現在有一個簡單的加密方法叫做「Twist」,傳送者和接收者必須要約定一個正整數 k,做為密鑰 (secret key)。
「Twist」加密法要使用到四個陣列:plaintext 和 ciphertext 是字元陣列,而 plaincode 和 ciphercode 是整數陣列,所有陣列的長度為 n,n 代表要被加密訊息的長度。所有陣列一開始的初始值為 0,每個陣列的元素從 0 編號到 n - 1。在這問題中,所有的訊息只會包含小寫字母、一個點 .
和底線 _
(用來代表空白)。
要被加密的訊息會儲存在 plaintext 中。給你一個密鑰 k,下面是加密的過程:首先,將 plaintext 的字元,用下面的規則轉換成正整數並儲存在 plaincode 中:_
= 0、a
= 1、b
= 2、…、z
= 26、.
= 27;接著,利用下面的公式,將 plaincode 轉換到 ciphercode 中,公式是對於所有 $i$ 從 0 到 n - 1,
(在這裡 $x \bmod y$ 代表 x 除以 y 的餘數,例如 $3 \bmod 7 = 3$、$22 \bmod 8 = 6$ 且 $-1 \bmod 28 = 27$。你可以利用 C 語言的 %
運算子或是 Pascal 中 mod
運算子來計算,如果你算出是負數,就只要加個 y 就可以求出餘數)
最後,將 ciphercode 利用上面字元轉換的規則,轉成 ciphertext,因此最終的「twist 訊息」就存在 ciphertext 中。例如下面就是將 cat
字串用密鑰 5 做 twist 加密的結果:
陣列 | 0 | 1 | 2 |
---|---|---|---|
plaintext | c |
a |
t |
plaincode | 3 | 1 | 20 |
ciphercode | 3 | 19 | 27 |
ciphertext | c |
s |
. |
你的任務就是去寫一個程式去解密,也就是說給你一個密鑰 k,要你從密文反過來推出明文。例如,給你密鑰是 5 和密文 cs.
,你的程式必須輸出明文 cat
。
Input
輸入檔案包含一至多筆測試資料,最後會有一行只有 0
的測試資料,代表檔案結束。每筆測試資料只有一行,包含一把密鑰 k、一個空白、還有一個 twist 加密後的訊息,訊息長度最多有 70 個字元,密鑰 k 是一個正整數且不超過 300。
Output
對於每筆測資,輸出一行解密的訊息。
註:你可以假設解密一段訊息總是產生唯一解。(對於那些了解初等數論和抽象代數的人,這題目提供的所有測試資料中,k 和 n 的最大公因數都會是 1)
Sample Input
5 cs.
101 thqqxw.lui.qswer
3 b_ylxmhzjsys.virpbkr
0
Sample Output
cat
this_is_a_secret
beware._dogs_barking