题目
时间限制:1000ms
题目描述
HolmiumTS在Minecraft中非常缺少羊毛(问就是GTNH),所以他准备建立一个很大很大的羊羊牧场来提供足够的羊毛。
在Minecraft中,一只在第i天出生的小羊在第i+1天就可以长大,成为成年羊。
每一对成年羊每天可以产下一只小羊,但单独的一只成年羊是不可以产小羊的。
HolmiumTS在第0天带来了m只小羊,那么第n天结束之后,HolmiumTS一共会有多少只羊(包括小羊和成年羊)呢?
输入
第一行包含一个正整数,为数据组数t
接下来t行,每行2个整数,分别为n,m
输出
对于每组数据,输出一行,包含一个整数,为所求的结果
输入样例
1
3 5
输出样例
15
数据范围与约定
1<=t<=100
0<=n,m<=1e8
保证结果小于1e6
样例解释
第0天结束,有5只小羊,0只成年羊
第1天结束,有2只小羊,5只成年羊
第2天结束,有3只小羊,7只成年羊
第3天结束,有5只小羊,10只成年羊
提示
如果TLE了,注意输入可以有0,想一想数据实际可能的范围,如何判断最坏情况。
思路分析
这是一个比较简单的斐波那契问题,因为没有小羊死亡的情况,而且小羊出生的第二天就能生育,所以说比较简单
我们可以直接用循环或递归模拟小羊的数量变化过程
AC代码
//循环方法
#include <stdio.h>
long long gro, new;
int main()
{
int n, m, t;
scanf("%d", &t);
for (int i = 0; i < t; i++)
{
scanf("%d %d", &n, &m);
if (m == 0 || m == 1)
{
printf("%d\n", m);
continue;
}
gro = 0;
new = m;
for (int i = 1; i <= n; i++)
{
gro += new;
new = gro / 2;
}
printf("%lld\n", gro + new);
}
return 0;
}
cz大佬的递归版本
#include<stdio.h>
int solve(int num, int day)
{
return day <= 0 ? num : solve(num / 2 + num, --day);
}
int main()
{
int t, n, m;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
printf("%d\n", m <= 1 ? m : solve(m, n));
}
return 0;
}