东方博宜OJ 1238:统计每个月兔子的总数 ← 递推 + long long

【题目来源】
https://oj.czos.cn/p/1238

【题目描述】
有一对兔子,从出生后第 3 个月起每个月都生一对兔子,一对小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死。
问第 n 个月(n≤50)的兔子总数为多少对?

【输入格式】
输入 1 个整数 n,表示第几个月。

【输出格式】
第 n 个月兔子的总数量有多少对?

【输入样例】
50

【输出样例】
12586269025​​​​​​​

【数据范围】
n≤50​​​​​​​

【算法分析】
● 递归实现的时间复杂度为 O(2^n)。n=30 时,需 2^30≈10^9次调用。n=50 时,需 2^50≈10^15 次调用。所以,在大多数系统上,递归实现无法处理 n>40 时的计算需求,通常在 n=30 左右即超时(TLE)。
● 本题需要采用 long long 数据类型。

【算法代码一:递推

#include <bits/stdc++.h>
using namespace std;

const int maxn=55;
long long f[maxn];

int main() {
    int n;
    cin>>n;
    for(int i=1; i<=n; i++) {
        if(i==1 || i==2) f[i]=1;
        else f[i]=f[i-1]+f[i-2];
    }
    cout<<f[n];

    return 0;
}

/*
in:50
out:12586269025
*/


【算法代码二:递归
本题中,n 会达到 50。所以,基于上文分析可知,下面递归的写法会超时(TLE)。

#include <bits/stdc++.h>
using namespace std;

int f(int n) {
    if(n==1 || n==2) return 1;
    else return f(n-1)+f(n-2);
}

int main() {
    int n;
    cin>>n;
    cout<<f(n);

    return 0;
}

/*
in:9
out:34
*/




【参考文献】
https://oj.czos.cn/p/1238



 

posted @ 2025-12-23 14:01  Triwa  阅读(2)  评论(0)    收藏  举报