阿猫的实验室

                                   阿猫的实验

阿猫很喜欢生物学。他还在今年的全国中学生生物学联赛中获得了一等奖。
一天,阿猫在实验室听说了这样一种繁殖能力很强的老鼠。
这种老鼠在出生后的第一个月,可以生出a 对老鼠;第二个月,可以生出b 对老鼠;第三个
月及以后的每个月,都可以生出c 对老鼠。
阿猫对此十分好奇。他很想知道,如果他有一对刚出生的老鼠,按最理想的模式繁殖,且老
鼠不死,那么最少需要多少个月它们就可以覆盖整个地球。
为了完成这一猜想,阿猫需要知道这种老鼠在第N 个月时的数量。

输入格式:

输入只有一行,四个数,分别为a,b,c,N(0<=a<=b<=c<=100,N<=3000),
其含义为题目所述。

输出格式:

输出只有一个数,为第N 个月老鼠的数量。

样例输入:

0 1 1 11

样例输出:

144

时间限制:

1000

空间限制:

65536
高精度,无话可说。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct bign{
    int len;
    int a[25001];
};
bign x[4],ac,bc;
int aa,bb,cc;
int n;
bign cheng(bign ans,int yy)
{
    bign xx=ans;
    for(int i=1;i<=xx.len;i++)
    {
        xx.a[i]*=yy;
    }
    for(int i=1;i<=xx.len;i++)
    {
        if(xx.a[i]>=10)
        {
            xx.a[i+1]+=xx.a[i]/10;
            xx.a[i]=xx.a[i]%10;
            if(i==xx.len) xx.len++;
        }
    }
    if(yy==0)
    {
        xx.len=0;
        xx.a[1]=0;
        for(int i=1;i<=20000;i++) xx.a[i]=0;
    }
    return xx;
}
void add(bign &ans,bign yc)
{
    for(int i=1;i<=yc.len;i++)
    {
        ans.a[i]+=yc.a[i];
    }
    ans.len=max(ans.len,yc.len);
    for(int i=1;i<=ans.len;i++)
    {
        if(ans.a[i]>=10)
        {
            ans.a[i+1]+=ans.a[i]/10;
            ans.a[i]=ans.a[i]%10;
            if(i==ans.len) ans.len++;
        }
    }
}
void jian(bign &ans,bign yc)
{
    for(int i=1;i<=yc.len;i++)
    {
        ans.a[i]-=yc.a[i];
    }
    for(int i=1;i<=ans.len;i++)
    {
        if(ans.a[i]<0)
        {
            ans.a[i]+=10;
            ans.a[i+1]--;
        }
    }
    for(int i=ans.len;i>=1;i--)
    {
        if(ans.a[i]!=0)
        {
            ans.len=i;break;
        }
    }
}
void print(bign xx)
{
    for(int i=xx.len;i>=1;i--)
    {
        cout<<xx.a[i];
    }
}
int main()
{
    cin>>aa>>bb>>cc>>n;
     
    x[1].a[1]=1;x[1].len=1;
    for(int i=1;i<=n;i++)
    {
        ac=x[1];
        add(x[1],cheng(ac,aa));
        add(x[1],cheng(x[2],bb));
        add(x[1],cheng(x[3],cc));
        add(x[3],x[2]);
        x[2]=ac;
        jian(x[1],ac);
    }
    add(x[0],x[1]);add(x[0],x[2]);add(x[0],x[3]);
    print(x[0]);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值