1 条题解
-
0
分析
可以使用递归,但是复杂度为 会超时,可以使用记忆化解决,也可以使用递推。使用 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
- 上传者