題目連結:
給定一正整數,代表有多少筆的測試資料。每筆的第一列給定一正整數 d (d = 2 或 3)。接下來 d 列輸入,每列給定 d 個正整數(介於 0 ~ 10 之間),代表有一 d × d 的變換矩陣。
再接著一列輸入給定十二個字元(內容只會是 0 ~ 9 的數字及「:」,對其依序編號為 0 ~ 10),代表已經變換過後的字串。
求給定矩陣的反矩陣以及十二個字元的反變換。
反變換的方法如下:
設 d = 2 、字串為 6:19278694:2 且反矩陣為
則我們可先將原有的字串轉成數字為 6, 10, 1, 9, 2, 7, 8, 6, 9, 4, 10, 2 。則把字串分成 12 ÷ 2 = 6 個等分。先取前一等分(前兩個字元的編號)並排成
6
10
如此的 2 × 1 矩陣。並在左邊乘上反矩陣即可變回變換前的樣子(記得編號要轉回對應的字元,且編號要事先取 11 的餘數):
2
2
輸出格式為:
先輸出測試資料的個數(佔四格位置,並靠右對齊,不足的補上空格)。
再對每一筆測試資料先輸出矩陣的大小,再輸出矩陣的內容(每個數字套用以上的格式)。最後再輸出字串解密後的內容。
2
2
2 1
3 2
6:19278694:2
3
1 1 1
1 2 2
1 2 3
26242669:976
2
2
2 10
8 2
224488::3377
3
2 10 0
10 2 10
0 10 1
9876543210::
註:題目原本的範例輸出有誤,於此更正。
實作起來稍微麻煩的一題且原題異常地難懂(這邊的敘述已經由英翻中且改為較容易理解的形式)。
首先要先求反矩陣(如果不熟悉線性代數甚至是矩陣本身的性質的話,方法請見
這裡)。可以硬 A 暴力解出,也可以使用高斯消去法求得。
接著將字串的字元分成 12 ÷ d 組。對其做反矩陣變換(如上面所述,在此組的左邊乘上反矩陣),然後輸出變換後的結果即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。