欢迎光临散文网 会员登陆 & 注册

【ROSALIND】【练Python,学生信】44 可变剪接数目

2020-05-25 15:59 作者:未琢  | 我要投稿

如果第一次阅读本系列文档请先移步阅读【ROSALIND】【练Python,学生信】00 写在前面  谢谢配合~

题目:

可变剪接的数目

Given: Positive integers n and m with 0≤m≤n≤2000.

所给:两个正整数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。

 

测试数据

6 3

测试输出

42

 

生物学背景

        真核生物的基因组是不连续的,只有外显子(exon)才能在最终成熟的mRNA中出现。同一个基因可以产生不同的mRNA,这是因为存在可变剪接(alternative splicing),即并非所有的外显子都会参与mRNA的形成,有些外显子可以和内含子一起被从成熟的mRNA中剔除掉。

        可变剪接在进化中十分重要,可以增加同一个基因编码蛋白的个数。

 

数学背景

        在可变剪接中,外显子之间的顺序不变,不涉及排列问题,因此本题的数学知识与43 计算子集数目完全一致,只是43 计算子集数目是计算所有组合的数目之和,本题只是计算给定数目的组合之和。

 

 

思路

        本题实质是在考察如何在数特别大的时候避免溢出错误,在计算组合数时,如果数值过于巨大,直接用除号/得到的浮点数无法储存,会提示错误;因此用整数除法号//来计算,得到的值是整形,程序可以正确运行。

 

 

代码

def myfactorial(n, m):
   
"""自己定义一个可以算阶乘的函数,计算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): # 利用循环计算组合总数
   
tep = myfactorial(n, n-i+1)//myfactorial(i,1) # 套用组合公式,//代表整数除法
   
result += tep

print(result % 1000000)

 


【ROSALIND】【练Python,学生信】44 可变剪接数目的评论 (共 条)

分享到微博请遵守国家法律