/*
【题目大意】
一对兔子每个月可以产两只小兔子,小兔子过了m个月可以长大,兔子不会死,求d个月之后兔子的总数
【解题思路】
不可生育的兔子用数组存储,高精度加法
*/
/*
Run Time: 0.06secs
Run Memory: 312KB
*/
#include <iostream>
#include <string>
using namespace std;
int m; //兔子长大需要的时间 1-10
int d; //d个月之后 1-100
string actCount; //初始化可生育兔子数
string unAct[11]; //不可生育兔子数(0到m-1)
//高精度加法
inline string Add(string a, string b){
//调节为a长b短
if(a.length() < b.length()){
string buf = a;
a = b;
b = buf;
}
//补零
a += '0';
while(a.length()-b.length() != 0)
b += '0';
int add = 0;
string result = "";
for(int i=0; i<b.length(); i++){
int buf = add + (a[i]-'0') + (b[i]-'0');
if(buf/10 == 1)
add = 1;
else
add = 0;
result += (buf%10) + '0';
}
if(result[result.length()-1] == '0')
return result.substr(0, result.length()-1);
else
return result;
}
int main()
{
while (cin>>m>>d && (m || d)){
actCount = "1";
for(int i=0; i<m; i++)
unAct[i] = "0";
for(int i=1; i<=d; i++){
actCount = Add(actCount, unAct[0]); //一部分兔子已经可以生育
for(int j=1; j<m; j++) //众多兔子逐渐成熟
unAct[j-1] = unAct[j];
unAct[m-1] = actCount; //可生育的兔子生小兔子
}
for(int i=0; i<m; i++){
actCount = Add(actCount, unAct[i]);
}
for(int i=actCount.length()-1; i>=0; i--)
cout << actCount[i];
cout << endl;
}
return 0;
}
Sicily 1029. Rabbit
最新推荐文章于 2015-09-24 09:32:32 发布