題目連結(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),該值為何?
仔細(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)各位大大撥冗討論。