ETH官方钱包

切換
舊版
前往
大廳
主題

ZeroJudge - d443: 10497 - Sweet Child Makes Trouble 解題心得

Not In My Back Yard | 2018-10-20 11:10:40 | 巴幣 0 | 人氣 471

題目連結(jié):


題目大意:
給定一正整數(shù) N(N ≦ 800),代表原本有N個(gè)物件,編號(hào)為 1 ~ N ,排在 1 ~ N 的位置。

求重新排列,使得 N 個(gè)物件都不在自己原來的位置上(也就是「錯(cuò)排」)的方法數(shù)為何?

當(dāng) N = -1 時(shí),代表輸入結(jié)束。



範(fàn)例輸入:
1
2
3
4
-1



範(fàn)例輸出:
0
1
2
9



解題思維:
當(dāng)窮舉方法數(shù)的時(shí)候,乍看之下可能沒有什麼規(guī)律。但是仔細(xì)觀察可以發(fā)現(xiàn),一些疑似遞迴的蹤跡。

考慮以下情況,當(dāng) N ≧ 3時(shí):
有鑑於第 N 個(gè)數(shù)字不會(huì)排在第 N 個(gè)位置,一定會(huì)放在1 ~ N-1其中之一。這時(shí),它放的位置假設(shè)為 K ,而 K 放的地方有兩種情形。

第一種, K 放在 N 的位置,也就是 N、K 位置互換。那麼,剩下的N-2個(gè)數(shù)字之原本的位置也就都尚未被占去。因此這個(gè)情況等價(jià)於 N-2 時(shí)的方法數(shù)。

第二種, K 沒有放在 N 的位置。由於我們已經(jīng)把 N 放在 K 的位置,而K絕對(duì)不會(huì)放在N的位置。我們把放在 K 位置的N拿掉,剩下的物件就像是 N-1 時(shí)的情況之排列(K就變成了新的N)。因此等價(jià)於 N-1 時(shí)的方法數(shù)。

又因?yàn)椋畏诺臅r(shí)候,可以從1 ~ N-1任意挑一個(gè)位置放(也就是K是其中任意數(shù)字)。因此K有N-1種可能挑法。

所以, N 的方法數(shù) = (N-1)*(N-1的方法數(shù) + N-2的方法數(shù))。



而又因?yàn)椋慰傻剑福埃暗木壒剩虼松鲜鲞f迴式的值會(huì)增長(zhǎng)到突破C++的整數(shù)型態(tài)上限,為此,我們需要大數(shù)運(yùn)算,詳見這裡




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

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

更多創(chuàng)作