作者:Jean_香香 | 来源:互联网 | 2023-10-13 12:48
思路分析:1、以普通的第\(i\)个蜂房进行思考,将它的状态描述为:\(f[i]\),这是一个一维数组。它可以由哪些状态转移过来?由题意,可以从\(i-1\),\(i-2\)而来。
思路分析:
1、以普通的第\(i\)个蜂房进行思考,将它的状态描述为:\(f[i]\),这是一个一维数组。它可以由哪些状态转移过来?由题意,可以从\(i-1\),\(i-2\)而来。
根据加法原理有\(f[i]=f[i-1]+f[i-2]\),其中\(i>2\),而\(f[1]=f[2]=1\)。
这就是一个斐波那契数列
啊!
2、看一下数据量,\(M<=N<=1000\),我们知道,\(1000\)极限值的斐波那契数列可不是一个小数字,\(int\)肯定暴掉,\(long\ long\)也是白费,\(usinged\ long \ long\)可以一试,根本还是高精度加法。
c++ 代码
#include
using namespace std;
//高精度+裴波那契数列
//本题目考点:
//1、递推
//2、递推关系式的推导:找出任意一个位置,思考它是怎么来的,再用加法原理。
vector add(vector &A, vector &B) {
if (A.size() vector C;
int t = 0;
for (int i = 0; i t += A[i];
if (i C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
int main() {
int m, n;
cin >> m >> n;
vector A, B, C;
A.push_back(1);
B.push_back(1);
for (int i = 3; i <= n - m + 1; i++) {
C = add(A, B);
//对加数需要重新赋值
//A<---B
A.assign(B.begin(), B.end());
//B<---C
B.assign(C.begin(), C.end());
}
//倒序输出结果
for (int i = B.size() - 1; i >= 0; i--)printf("%d", B[i]);
return 0;
}