我覺得你的問題可以表述爲如下:
有多少個排列有元素a_0, a_1, ... a_n-1, b_0, b_1, ..., b_m-1
的列表,其中沒有a_k
元素位於k
? (讓我們表示與p_{n,m}
這個數字 - 您的具體問題是p_{6,5}
值)。
請注意,您的建議公式5 * 6是因爲以下的不正確: 它只能算作案件,其中!在a_k
s爲前6位(沒有任何人在自己的索引的位置是的),和b_k
S於最後5 你不要指望像任何其他配置:a_3, b_4, b_1, a_0, a_5, b_0, a_2, b_2, b_3, a_1, a_4
,這裏的順序是完全混合。
對於所有元素中的!11元素紊亂的子集,您的其他想法也是不正確的,因爲任何b_k
都可以在任何位置。
但是,根據a_0
的位置,我們可以通過將p_{n,m}
的遞歸公式分爲兩種情況輕鬆添加遞歸公式。
如果a_0
獲取位置1, 2, ..., n-1
之一。 (n-1
不同的可能性。) 這意味着a_0
都不在位置0
,並且它還通過佔據該位置防止另一個a_k
位於位置k
。因此,這個a_k
成爲'自由',它可以去任何其他職位。如果a_0
以這種方式得到修復,其他元素可以通過不同的方式以p_{n-2,m+1}
進行排列。
如果a_0
進入n, n+1, ..., n+m-1
的其中一個位置。 (m
不同的可能性)。 這種方式沒有其他a_k
被阻止在對應於它的索引的位置。其他元素可以用p_{n-1,m}
不同的方式排列。
將它們加在一起給出了遞歸:p_{n,m} = (n-1)*p_{n-2,m+1} + m*p_{n-1,m}
。因爲它意味着每個元素可以在任何位置,所以每個m
停止條件爲p_{0,m}=m!
。
我也編碼它的Python:
import math
def derange(n,m):
if n<0:
return 0
elif n==0:
return math.factorial(m)
else:
return (n-1)*derange(n-2, m+1) + m*derange(n-1, m)
print derange(6,5)
給22852200.
如果你有興趣在一般情況下,你可以找到一些OEIS相關序列。 搜索詞「差異因子數」可能很有趣,例如三角形:http://oeis.org/A047920。 還有一篇文章提到那裏:http://www.pmfbl.org/janjic/enumfun.pdf,也許它可以幫助,如果你有興趣在n
和m
通用封閉公式。突然之間,我沒有任何想法想出來,但我認爲這可能是一個很好的起點。
這個問題的另一個可能的目的地是http://crypto.stackexchange.com/(儘管檢查他們的幫助部分是肯定的)。 –
在發佈完整答案之前,只有兩條簡短評論:!11不是39916800,而是5!* 6!只是正確結果的一個子集,因爲這兩個羣體可以「混合在一起」,而不僅僅是獨立排列。 – elias
對不起,這是一個錯字,11! = 39916800,!11 = 14684570 - 我會修改它..你如何表達這兩個組合「混合在一起」?我認爲這是我沒有得到的部分..感謝您的回覆 – guskenny83