目录
问题:
法一:
法二:
例题:
问题:
已知斐波那契数列的第一个和最后一个数字,如何求整个数列(即第二个数字)
法一:
主要是将数列拆分成两个数列的思想
法二:
暴力,循环第二个数字,计算最后一个数字,直到计算正确为止。
例题:
P1011 [NOIP 1998 提高组] 车站 - 洛谷
#include <bits/stdc++.h>
using namespace std;
int a, n, x;
long long m;
//int every[25];//[4]:从第四站到第五站之间车上的人数
//int up[25];//[4]第四站上车人数
int A[50];
int B[50];
//up[i] = A[i] * a + B[i] * b;
//every[i] = every[i - 1] + up[i - 2];
//down[i]=up[i-1];
int sum_a, sum_b;
int main() {cin >> a >> n >> m >> x;if (n <= 3) {}A[1] = 1;A[2] = 0;B[1] = 0;B[2] = 1;for (int i = 3;i < 25;i++) {A[i] = A[i - 1] + A[i - 2];}for (int i = 3;i < 25;i++) {B[i] = B[i - 1] + B[i - 2];}int b;if (n > 4) {for (int i = 1;i <= n - 3;i++) {//注意n的范围sum_a += A[i];sum_b += B[i];}b = (m - a - sum_a * a) / sum_b;}if (x == 1||x==2) {cout << a;return 0;}sum_a = 0;sum_b = 0;for (int i = 1;i <= x-2;i++) {sum_a += A[i];sum_b += B[i];}cout << a + sum_a * a+sum_b * b;return 0;
}
注意:
1.当n<=4时
得到sum_b=0;此时报错(越界)
2.首先up[i]是斐波那契数列,继续推断可得,every[i]可以累加得到