斐波那契数列,水题
题目的意思,就是要解 一元一次方程。
第 n - 1 个车站上的总人数,和 第1 个车站上车人数 a1 和 第2个车站的上车人数有关。
数组 a1[k] 表示 第k个车站,上车的旅客人数,包含 a1 的多少倍。
数组 a2[k] 表示 第k个车站,上车的旅客人数,包含 a2 的多少倍。
第 n - 1 车站,总人数为 m, 因此算出表达式 a1 * u + a2 * v == m.
这个方程 a1 == a, m 已知, u 和 v 由递推关系算出来, 然后方程变成了 一元一次方程。
解 出 a2
本题要点:
1、 前缀和 s1[k], 表示 第k 个车站总人数, 包含 a1 多少倍。
2、 a1, a2 都已知, 题目要求求出第x 个车站 的总人数,再根据前缀和,很容易算出
第 x 个车站的总人数。
3、x的范围 1 ~ n - 1, 对于 车站 1, 2, 直接输出 a.
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 21;
int a1[MaxN], a2[MaxN], s1[MaxN], s2[MaxN];
int a, n, m, x;
int main()
{
scanf("%d%d%d%d", &a, &n, &m, &x);
a1[1] = 1, a1[2] = 0, a2[1] = 0, a2[2] = 1;
s1[1] = s1[2] = 1, s2[1] = 0, s2[2] = 1;
if(n == 1 || n == 2)
{
printf("%d\n", a);
return 0;
}
for(int i = 3; i <= n - 3; ++i)
{
a1[i] = a1[i - 1] + a1[i - 2];
s1[i] = s1[i - 1] + a1[i];
a2[i] = a2[i - 1] + a2[i - 2];
s2[i] = s2[i - 1] + a2[i];
}
int t = (m - s1[n - 3] * a - a) / s2[n - 3];
printf("%d\n", s1[x - 2] * a + a + s2[x - 2] * t);
return 0;
}
/*
5 7 32 4
*/
/*
13
*/