密碼學 (Cryptography) 是一套關於如何將訊息 (又稱為明文 (plaintext)) 轉換成暗號 (又稱為密文 (ciphertext)) 的秘密通訊方法,除非你是接收者,否則沒有人可以從密文中找出原本的明文。而將明文轉換成密文的過程,我們稱為加密 (encryption);反之,把密文轉成明文的過程被稱為解密 (decryption)。現在有一個簡單的加密方法叫做「Twist」,傳送者和接收者必須要約定一個正整數 k,做為密鑰 (secret key)。

「Twist」加密法要使用到四個陣列:plaintextciphertext 是字元陣列,而 plaincodeciphercode 是整數陣列,所有陣列的長度為 n,n 代表要被加密訊息的長度。所有陣列一開始的初始值為 0,每個陣列的元素從 0 編號到 n - 1。在這問題中,所有的訊息只會包含小寫字母、一個點 . 和底線 _ (用來代表空白)。

要被加密的訊息會儲存在 plaintext 中。給你一個密鑰 k,下面是加密的過程:首先,將 plaintext 的字元,用下面的規則轉換成正整數並儲存在 plaincode 中:_ = 0、a = 1、b = 2、…、z = 26、. = 27;接著,利用下面的公式,將 plaincode 轉換到 ciphercode 中,公式是對於所有 $i$ 從 0 到 n - 1,

$ciphercode[i] = (plaincode[ki \bmod n] - i) \bmod 28.$

(在這裡 $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

社團的一群學生每年會到外地旅遊,他們過去曾經去過印第安納波利斯 (Indianapolis)、鳳凰城 (Phoenix)、納許維爾 (Nashville)、費城 (Philadelphia)、聖荷西 (San Jose)、亞特蘭大 (Atlanta)、恩荷芬 (Eindhoven)、奧蘭多 (Orlando)、溫哥華 (Vancouver)、檀香山 (Honolulu)、比佛利山 (Beverly Hills)、布拉格 (Prague)、上海 (Shanghai)、和聖安東尼奧 (San Antonio)。今年春天他們希望有個類似的旅行,但是並不確定時間和地點。

旅程中,他們慷慨的贊助商總是給他們很多種背包和手提包,他們必須在回家前把這些包包整理好。但是機場只允許運送一定數量的行李,他們決定將禮物放到一個包包、再將這包包放到另外一個包包中,使得產生的行李儘可能地少。

所有的包包形狀都是相同的,只有他們的線性維度不同,而線性維度是一個正整數且不超過 1000000,一個維度較小的包包可以放入一個維度較大的包包。您必須去計算哪個包包要放入其他包包使得行李的總數要最小 (也就是最外層包包的數量),於此同時,在行李數量最少的情況下,也要讓每個行李中包包的數量儘可能地少。

標準輸入包含多組測試資料,每組測試資料包含一個整數 $1\leq{n}\leq{10000}$ 代表包包的數量,接著有 n 個數字分別在一到數行中,每個數字代表包包的線性維度。最後一組測資後有一數字 0。對於每組測資,輸出最小的行李數 k,接著有 k 行,每行輸出每件行李中所有包包的維度,這些維度由空白隔開。每個在輸入內的線性維度只會在輸出中出現恰好一次,且每行中,若有多於一種答案,則輸出任何一種皆可。對於每組測資間輸出一空白行。

Sample Input

6
1 1 2 2 2 3
0

Output for Sample Input

3
1 2
1 2
3 2

在計算機科學學生會唯一一台印表機的工作量相當繁重,有時這台印表機上有上百個工作在列印佇列 (printer queue) 中,使得你要花上數小時的等待去拿到僅有一頁的輸出。

因為有些工作比其他工作更重要,「黑客將軍 (Hacker General)」發明了一套簡單的優先權系統來管理列印佇列。現在,每個工作的優先權為 1 和 9 之間 (9 是最高優先權,1為最低),印表機的操作如下:

  • 把在佇列的第一個工作 J 從佇列中取出。
  • 如果有些在佇列中的工作,其優先權比 J 更高,那麼將 J 移至佇列尾端而不進行列印。
  • 否則,執行工作 J (並且不要把它放回佇列)。

這樣一來,黑客將軍想要列印的所有重要的杯子蛋糕 (muffin) 食譜可以很迅速的被印出來。當然,像那些煩人的學期論文這一類的文件就可能要等待一段時間,但,這就是生活。

對於新的做法,你的問題是這樣的做法在估計何時完成你的列印工作時變得很棘手,你決定寫一支程式來找出完成時間,這個程式會給定當前佇列 (所有工作的優先權),以及你的工作在佇列中的位置,你必須計算你的工作何時結束,假設接下來不會有新的工作加入佇列,為了簡化問題,我們假設每個工作列印時間總是一分鐘,把工作加入佇列或從佇列中移除都是瞬間完成。

閱讀全文 »

一張圖 (graph) $G$ 有一個點集 $V(G)$ 和一個邊集 $E(G)$,其中邊集 $E(G)$ 內的元素是 $V(G)$ 中相異兩個無序點對。

範例一:令 $G$ 是一張圖,$V(G) = \{a, b, c, d\}$$E(G) = \{(a, b), (b, c), (c, d), (d, b)\}$,下圖給出整個圖 $G$

注意圖 G 包含一個「環」$\{(b, c), (c, d), (d, b)\}$。一張缺乏環的圖我們稱為樹 (tree)。圖 G 的一條路徑 (path) 是點和邊的交替序列 (序列是由點開始和結束) 且路徑上所有點皆相異。在範例一的圖中,$\{a, (a, b), b, (b, c), c, (c, d)\}$ 是一條路徑。

事實:樹上任意兩點的路徑是唯一的

如果一張圖任意點對有一條路徑,則圖是連通的 (connected),範例一的圖即是連通的。如果一張圖沒有連通而有數個子圖 (subgraph),則每個子圖被稱為圖 $G$ 的連通分量 (connected component)。

如果一張圖的連通分量都是樹,則整張圖稱為森林 (forest),見下圖。

一個值得一提的極端例子,就是若有一個連通分量樹只有一個點而沒有邊,這棵樹就像是一個孤立點,我們稱之為橡實 (acorn)。接下來我們來定義本問題。

問題:給一座森林,請您寫一隻程式計算有幾棵樹和幾個橡實。

閱讀全文 »

在自然界中,存在著食物鏈 (alimentary chain),在食物鏈的底層通常是植物 (vegetal),小型動物吃這些植物,然後大型動物吃這些小型動物。食物鏈可以是環狀,當有些動物死掉後他將會分解變成礦物質,而這些礦物質會是植物的營養來源。

在這題目中,給你一堆生物,你將找出最大的食物鏈。如果 $A$$B$ 的掠食者 (predator),則你可以將他們都視為在相同食物鏈中。

閱讀全文 »

給定 $N$$K$,請從 1 到 $K$ 的字典順序排列中,找出第 $N$ 個排列,$N$ 從 0 開始,因為 $N$ 會很大,因此我們用 K 個非負整數 $S_1$, $S_2$, $\cdots{}$, $S_k$ 來表示。從這一系列的數字,我們可以用下面的公式計算 $N$

$\sum^{K}_{i=1}{S_i\times{(K-i)!}}$
閱讀全文 »

電位計 (potentiometer,簡稱 potmeter) 是一種有可變電阻的電子設備,它有兩個接點 (terminal) 和一些控制結構 (通常是刻度盤、齒輪或者滑塊) 使得我們可以調整兩接點間的電阻值從 0 (無電阻) 到一個最大值。電阻的單位是歐姆 (Ohm),當有兩個以上的電阻串聯 (也就是一個接著一個連接) 在一起,總電阻就會是個別電阻的總和。

在這個問題中,我們考慮 $N$ 個串聯的電位計,從左到右分別編號為 1 號到 $N$ 號,第 $x$ 號的電位計左側接點和第 $x-1$ 號的右側相連,且第 $x$ 號的電位計右側接點和第 $x+1$ 號的左側相連,而 1 號電位計的左側接點和 $N$ 號的右側接點並沒有接上其他東西。

一開始所有電位計會有介於 0 到 1000 歐姆的電阻,我們可以做兩件事:

  • 設定其中一個電位計為另一個電阻值
  • 測量任意兩個接點之間的電阻
閱讀全文 »

Beggar My Neighbour 這一款紙牌遊戲,另一個名稱為 StripJackNaked,設計用來介紹給新手學習認識撲克牌的大小和數值。

經過洗牌之後,依序發給兩名玩家,第一張牌發給新手,下一張給老手,依序交替直到每名玩家都有 26 張牌,並且由老手拿到最後一張牌。

由新手先出牌,他必須將面朝下的一疊牌中由頂端依序出牌,打出的第一張牌也就是倒數第二張發出的牌。

後手必須根據前一回合最後一張牌出相,並且依序蓋住前面那一個人的牌,出牌直到出現 J Q K A 中一張牌,便可以換手。但是如果前一個人留下的牌為

  • 前一個留下 JACK,則最多出 1 張牌
  • 前一個留下 QUEEN,則最多出 2 張牌
  • 前一個留下 KING,則最多出 3 張牌
  • 前一個留下 ACE,則最多出 4 張牌
  • 其他,則出一張牌之後換手

如果在指定次數內出牌多次沒有出現 J Q K A 其中一張牌,則必須將之前出在盤面上的所有牌覆蓋後收入收牌最下方,然後打出一張牌後換手。遊戲直到任何一方手牌為空。

寫程式模擬這一款遊戲。

閱讀全文 »

大多數人會在日曆上標記重要的事件,例如看牙醫、書籍特價、編程競賽 … 等,不過也有每年都會定期發生的事件,如小夥伴的生日、結婚紀念日 … 等,常忘事的人們需要在這些重要的日子前被通知重要的事件即將來臨,這樣有助於幫助記憶。

寫一支程式提供類似的服務。輸入的日曆將年份將於 1901 年到 1999 年之間,在這段日期中,只有年份被 4 整除的是閏年,閏在 2/29 日。對於每組詢問,輸出當日和即將發生的事情的重要性。

閱讀全文 »

許多城市都提供相當完善的公眾交系統,通常會整合公路路線、郊區通勤列車以及地鐵,路線可以根據車站或者是站牌作分類。

為了方便思考,將路線假象成一條線 (從起點發車之後在終點處折返),而循環則是在一條路線中的兩端是相同的。同時可以發現,有些路線非常相似,可以在路線上的幾個站彼此相連,這也是改變路線的唯一方式。

簡化問題後,每一條路線將會由大寫字母 ‘A’ - ‘Z’ 表示,同時每一個路線中將會用小寫字母 ‘a’ - ‘z’ 表示該路線之中的站牌。

寫一個程式,找到兩站之間的路線使用最少的時間抵達。在同一條路線上移動只消耗 1 單位時間,而在轉運站換搭其他路線消耗 3 單位時間。

閱讀全文 »