求基因型总数

来源:互联网 发布:浩方对战平台网络联机 编辑:程序博客网 时间:2024/04/29 16:32

【题目描述】
生物的各种性状是由基因控制的。一个性状,可能表现为显性,也可能表现为隐性,显性基因用一个大写字母表示,相应的隐性基因由此字母的小写形式来表示。每个性状由两个基因控制。当且仅当这两个基因都为隐性时,性状表现为隐性,否则表现为显性。形成生殖细胞时,这两个基因彼此分开,其中的一个与另一方的一个搭配。
例如,基因为DD和Dd的两个生物交配,产生的后代,基因可能为DD,或Dd。每个生物当然不只一种性状,当性状数大于一时,遗传也遵循上述规律。例如说,AAbb和AaBb交配,后代的基因可能为:AABb,或AAbb,或Aabb,或AaBb。
所有基因皆为显性的生物叫显性纯合子,所有基因皆为隐性的生物叫隐性纯合子。我们把显性纯合子与隐性纯合子交配,产生许多后代,统称为F1代。再用F1代的生物进行交配(近亲结婚啊!),产生的后代叫F2代。……,依此类推。我们把一种基因的组成叫做一种基因型,例如AaBB是一种基因型,BBAa和它的组成是一样的,所以是同一种基因型。另外,Aa和aA也是一样的。AaBb和AaBB则是不同的基因型。(后者多了一个B,少了一个b)。另外,性状数量超过二十六时,英文字母就不够用了。不过不用管它,我们假设有足够的英文字母来表示控制不同性状的基因。
现在,输入性状总数n,(1<=n<=1000),和交配的代数m(1<=m<=100),求Fm代生物基因型可能的总数。
【输入格式】
两个整数n和m
【输出格式】
Fm代生物可能的基因型的总数
【样例输入】
2 2
【样例输出】
9
【分析】
先考虑m=1的情况。一开始是AA和aa交配,AA只能提供A,aa只能提供a,所以后代只有Aa。
然后Aa之间杂交,双方都可以提供A、a,组合可以得到下一代有AA,Aa,aa,有3种,以后每一代都有Aa这样的基因型,所以每代都有这三种,而对于A(a)这种形状来说,总共也只有这3种形状。所以m>1的时候,答案就是3^n。
当然,3^1000用long long也是存不下的,必须用高精了。高精度并不难吧。

#include<cstdio>#include<iostream>using namespace std;int main(){    int n,m;    cin>>n>>m;    if (m==1) {cout<<1;return 0;}    int a[100000];    a[0]=1;    int k=1,temp,carry=0,i,j;    for (i=0;i<n;i++){        carry=0;        for(j=0;j<k;j++){            temp=a[j]*3+carry;            a[j]=temp%10;            carry=temp/10;        }        if (carry!=0) a[k++]=carry;    }    for (i=k-1;i>=0;i--) printf("%d",a[i]);}
3 0