【ROSALIND】【練Python,學(xué)生信】 27 部分排列

如果第一次閱讀本系列文檔請(qǐng)先移步閱讀【ROSALIND】【練Python,學(xué)生信】00 寫在前面 ?謝謝配合~

題目:
部分排列(Partial Permutations)
Given: Positive integers n and k such that 100≥n>0 and 10≥k>0.
所給:兩個(gè)正整數(shù)n和k,其中100≥n>0,10≥k>0。
Return: The total number of partial permutations P(n,k), modulo 1,000,000.
需得:由n,k所得部分排列的組合數(shù)的模。
?
測(cè)試數(shù)據(jù)
21 7
測(cè)試輸出
51200
?
生物學(xué)背景
親緣關(guān)系相近的物種通常共有某些基因,我們通過(guò)比較這些基因能夠?qū)?dǎo)致改變的基因重排現(xiàn)象進(jìn)行研究。但不同的基因組并不遵照同樣的方式進(jìn)化,必然會(huì)產(chǎn)生不同的基因,因此我們需要用改進(jìn)之前的全排列方式,考慮只有部分基因參與排列的情況。
?
數(shù)學(xué)背景
對(duì)排列的介紹請(qǐng)參考19?枚舉基因排列順序。
假設(shè)總體共有n個(gè)數(shù)據(jù),對(duì)于部分排列,我們只需要考慮其中k個(gè)數(shù)據(jù)的排列(k≤n),用P(n,k)表示排列總數(shù)。當(dāng)然,k=n時(shí),問(wèn)題又變成了n個(gè)數(shù)據(jù)的全排列,即P(n,n)=n!。
?
思路
從n個(gè)數(shù)中取k個(gè)數(shù)進(jìn)行排列。
?
代碼
def factorial(n):
??? """計(jì)算階乘的函數(shù)"""
??? fac = 1
??? i = n
??? while i > 1:
??????? fac = fac * i
??????? i -= 1
??? return? fac
n = 21
k = 7
fac = factorial(n) / factorial(n - k) # 從n中選k個(gè)數(shù)進(jìn)行排列
result = fac % 1000000 # 取模
print(result)