题目:1029. Rabbit
题意:
• 开始有一对成年兔子
• 每对成年兔子每个月产生一对小兔子
• 每只小兔子经过m个月变成成年兔子
• 问经过d个月后有多少兔子
• 约束: 1 <= m <= 10, 1 <= d <= 100
解法:递推
• 这是一道计数问题,对于这类题目,一般是分
情况讨论。
• 比如说F[n]表示第n个月时兔子的数量
• 那么F[0] = 1
• 对于F[n](n>0),可以分成两部分:
• 第一部分上一个月已经有的兔子F[n-1]
• 第二部分新产生的兔子,那么新产生兔子需要经历d个月的兔子,那么就是F[n-d],所以我们可以得到递推式: F[n] = F[n – 1] + F[n – d]
• 另外注意的是对于Fn,我们为了切合实际情况,需要令F[n] = 1
• 注意到d=1时, F[n] = 2 * F[n – 1],这个时候F[100] = 2 ^ 100,这时我们需要高精度
• 对于递推式,我们只需要实现高精度加法就可以了
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <complex>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 102;
class bigInt{
public:
int num[maxn];//储存数字的数组
int len;//数字的长度
bigInt(int initVal = 0)
{
memset(num, 0, sizeof(num));
num[0] = initVal;
len = 1;
}
void printNum()
{
for (int i = len - 1; i >= 0; i--)
{
cout << num[i];
}
cout << endl;
}
};
bigInt operator+ (const bigInt& a, const bigInt& b)//模拟竖式加法
{
bigInt res;
int i, temp;
int maxLen = max(a.len, b.len);
for (i = temp = 0; i < maxLen || temp > 0; i++)
{
if (i < a.len) temp += a.num[i];
if (i < b.len) temp += b.num[i];
res.num[i] = temp % 10;
temp /= 10;
}
res.len = i;//更新长度
return res;
}
int main()
{
int m, d;
while (cin >> m >> d && m && d)
{
bigInt F[maxn];
F[0].num[0] = 1;
for (int i = 1; i <= d; i++)
{
F[i] = F[i - 1];
if (i >= m)
{
F[i] = F[i] + F[i - m];
}
else
{
F[i] = F[i] + F[0];//F[i] = F[i] + 1
}
}
F[d].printNum();
}
//system("pause");
}