切換
舊版
前往
大廳
主題

ZeroJudge - a555: NCPC PD A Matrix Decipher 解題心得

Not In My Back Yard | 2019-07-24 23:30:10 | 巴幣 0 | 人氣 139

題目連結:


題目大意:
給定一正整數,代表有多少筆的測試資料。每筆的第一列給定一正整數 d (d = 2 或 3)。接下來 d 列輸入,每列給定 d 個正整數(介於 0 ~ 10 之間),代表有一 d × d 的變換矩陣。

再接著一列輸入給定十二個字元(內容只會是 0 ~ 9 的數字及「:」,對其依序編號為 0 ~ 10),代表已經變換過後的字串。

求給定矩陣的反矩陣以及十二個字元的反變換。

反變換的方法如下:
設 d = 2 、字串為 6:19278694:2 且反矩陣為
   2  10
   8   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 組。對其做反矩陣變換(如上面所述,在此組的左邊乘上反矩陣),然後輸出變換後的結果即可。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作