【ROSALIND】【練Python,學(xué)生信】44 可變剪接數(shù)目

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

題目:
可變剪接的數(shù)目
Given: Positive integers n and m with 0≤m≤n≤2000.
所給:兩個正整數(shù)n和m,有0≤m≤n≤2000。
Return: The sum of combinations C(n,k) for all k satisfying m≤k≤n, modulo 1,000,000.
需得:C(n,k)的所有總和,其中k滿足m≤k≤n。
?
測試數(shù)據(jù)
6 3
測試輸出
42
?
生物學(xué)背景
? ? ? ? 真核生物的基因組是不連續(xù)的,只有外顯子(exon)才能在最終成熟的mRNA中出現(xiàn)。同一個基因可以產(chǎn)生不同的mRNA,這是因為存在可變剪接(alternative splicing),即并非所有的外顯子都會參與mRNA的形成,有些外顯子可以和內(nèi)含子一起被從成熟的mRNA中剔除掉。
? ? ? ??可變剪接在進化中十分重要,可以增加同一個基因編碼蛋白的個數(shù)。
?
數(shù)學(xué)背景
? ? ? ??在可變剪接中,外顯子之間的順序不變,不涉及排列問題,因此本題的數(shù)學(xué)知識與43 計算子集數(shù)目完全一致,只是43 計算子集數(shù)目是計算所有組合的數(shù)目之和,本題只是計算給定數(shù)目的組合之和。
?
?
思路
? ? ? ??本題實質(zhì)是在考察如何在數(shù)特別大的時候避免溢出錯誤,在計算組合數(shù)時,如果數(shù)值過于巨大,直接用除號/得到的浮點數(shù)無法儲存,會提示錯誤;因此用整數(shù)除法號//來計算,得到的值是整形,程序可以正確運行。
?
?
代碼
def myfactorial(n, m):
??? """自己定義一個可以算階乘的函數(shù),計算n(n-1)(n-2)…(n-m)"""
??? sum = 1
??? i = n
??? while i >= m:
??????? sum = sum * i
??????? i -= 1
??? return sum
n = 6
m = 3
result = 0
for i in range(m,n + 1): # 利用循環(huán)計算組合總數(shù)
??? tep = myfactorial(n, n-i+1)//myfactorial(i,1) # 套用組合公式,//代表整數(shù)除法
??? result += tep
print(result % 1000000)
?