P1011 车站
题目描述
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n−1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
输入格式
a(≤20),n(≤20),m(≤2000),和x(≤20),
输出格式
从x站开出时车上的人数。
输入输出样例
输入 #1
5 7 32 4
输出 #1
13
可以打表解决, 分析在注释里
#include <iostream>
#include <cstdio>
using namespace std;
int C_a [25] = {0, 1, 1, 2}, C_b[25] = {0, 0, 0 , 0};
int main() {
/*
假设第二次上车下车的人数为 b
可以列一张三行的表格
上车 0 b a+b a+2b 2a+3b 3a+5b 5a+8b
下车 0 b b a+b a+2b 2a+3b 3a+5b
剩余 a a 2a 2a+b 3a+2b 4a+4b 6a+7b
a的系数为前两项a的系数的和-1
b的系数为前两项b的系数的和+1
*/
int a, n, m, x, b;
scanf("%d%d%d%d", &a, &n, &m, &x);
for (int i = 4; i <= n-1; i++) {
C_a[i] = C_a[i-2] + C_a[i-1] - 1;//a的系数
C_b[i] = C_b[i-2] + C_b[i-1] + 1;//b的系数
}
b = (m-a*C_a[n-1])/C_b[n-1]; //解方程求出上人数b
cout << a*C_a[x] + b*C_b[x];
return 0;
}