阿猫的实验
阿猫很喜欢生物学。他还在今年的全国中学生生物学联赛中获得了一等奖。
一天,阿猫在实验室听说了这样一种繁殖能力很强的老鼠。
这种老鼠在出生后的第一个月,可以生出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]);
}