1 条题解

  • 0
    @ 2024-9-24 20:17:40

    分析

    可以使用递归,但是复杂度为 O(2n)O(2^n) 会超时,可以使用记忆化解决,也可以使用递推。使用 long long 可以获得 60分,对于剩余的分数需要使用大数运算。

    递推+大数运算

    注意大数运算中需要从最低位开始,由于数据最开始是1位数,那么翻转后数据不变,所以可以省去翻转的步骤,在之后的运算中,当前所有数据一直处于翻转的状态,所以也无需翻转,只在最后结果处进行翻转即可。但是选手应该明白大数加法的本质以及程序实现。

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 201;
    vector<int> f[N];
    
    vector<int> add(vector<int>& a, vector<int>& b) {
        int la = a.size(), lb = b.size();
        vector<int> c;
        for (int i = 0, t = 0; i < max(la, lb) || t; i++) {
            if (i < la) t += a[i];
            if (i < lb) t += b[i];
            c.push_back(t % 10), t /= 10;
        }
        return c;
    }
    int main() {
        int n; cin >> n;
        f[1].push_back(1);
        f[2].push_back(1);
        for (int i = 3; i <= n; i++)
            f[i] = add(f[i - 2], f[i - 1]);
    
        vector<int>::reverse_iterator it = f[n].rbegin();
        for (; it != f[n].rend(); it++)
            cout << *it;
        cout << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    760
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    286
    已通过
    92
    上传者