ETH官方钱包

切換
舊版
前往
大廳
主題

ZeroJudge - c662: Hello Oscar 解題心得

Not In My Back Yard | 2019-06-28 22:00:51 | 巴幣 0 | 人氣 118

題目連結(jié):


題目大意:
測(cè)試資料有多筆輸入,每筆輸入佔(zhàn)一列。每列有不定量的數(shù)字(假設(shè)有 n (2 < n < 1, 000)個(gè)數(shù)字),其為連續(xù)數(shù)字 1 ~ n 的一種排列,並代表著一種位置替換的加密方法。

設(shè)現(xiàn)給定「1 4 2 3 0」,則代表其加密法為明文的(未加密)第 0 個(gè)字元為密文(加密)的第 1 個(gè)字元;明文第 1 個(gè)字元為密文的第 4 個(gè)字元;明文第 2 個(gè)字為密文的第 2 個(gè)字;明文第 3 = 密文第 3 ;而明文第 4 字為密文的第 0 個(gè)字。

而我們可以發(fā)現(xiàn)若多次使用同一組加密法,經(jīng)過(guò)一定次數(shù)之後密文會(huì)變回明文。設(shè)變回明文的次數(shù)為 oscar 值。試問(wèn),該值為何?



範(fàn)例輸入:
2 3 5 4 1 6 0
0 1 2 4 3


範(fàn)例輸出:
12
2


解題思維:
仔細(xì)觀察可以發(fā)現(xiàn) oscar 值其實(shí)等同於找出:
所有循環(huán)節(jié),以及所有循環(huán)節(jié)其長(zhǎng)度們的最小公倍數(shù)。

例如範(fàn)例測(cè)資的「2 3 5 4 1 6 0」,其有兩個(gè)循環(huán)節(jié)。分別為「0 → 2 → 5 → 6 →  0」和「1 → 3 → 4 → 1」,長(zhǎng)度各自是 4 與 3。而 4 與 3 的最小公倍數(shù)為 12 ,即是所求的 oscar 值。

但是因?yàn)?n 最大可以到 1, 000 ,因此存在極端情況:
其有 24 個(gè)長(zhǎng)度互質(zhì)的循環(huán)節(jié),長(zhǎng)度各自為 2 、3 、 5 、 7 、  …… 、 89 ,即前 24 個(gè)質(zhì)數(shù)。因此 oscar 數(shù)為 2 × 3 × 5 × …… × 89。如果使用 Python 、 Java 等語(yǔ)言不用擔(dān)心溢位的問(wèn)題。但 C 、 C++ 就不一樣了,後兩者沒(méi)有內(nèi)建的大數(shù)運(yùn)算。因此要自己寫(xiě)出大數(shù)乘法。作法可參考本人以前的文章
 
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說(shuō)明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。

創(chuàng)作回應(yīng)

更多創(chuàng)作