题目描述
火车从始发站(称为第 1 站)开出,在始发站上车的人数为 a,然后到达第 2 站,在第 2 站有人上、下车,但上、下车的人数相同,因此在第 2 站开出时(即在到达第 3 站之前)车上的人数保持为 a 人。从第 3 站起(包括第 3 站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第 (n-1)站),都满足此规律。现给出的条件是:共有 n 个车站,始发站上车的人数为 a,最后一站下车的人数是 m(全部下车)。试问 x站开出时车上的人数是多少?
输入格式
输入只有一行四个整数,分别表示始发站上车人数 a,车站数 n,终点站下车人数 m 和所求的站点编号 x。
输出格式
输出一行一个整数表示答案:从 x站开出时车上的人数。
输入输出样例
输入 #1
5 7 32 4
输出 #1
13
说明/提示
对于全部的测试点,保证 1 ≤a≤20,1 ≤x≤n≤20,1≤m≤2×。
本次考察的知识点是斐波那契数列,根据题意,列出多个站的上下车人数以及车上人数能清晰地找到信息的关系
车站 | 上车人数 | 下车人数 | 人数增加量✳ | 到站时人数✳ |
第一站 | a | 0 | a | a |
第二站 | t | t | 0 | a |
第三站 | a+t | t | a | 2a |
第四站 | a+2t | a+t | t | 2a+t |
第五站 | 2a+3t | a+2t | a+t | 3a+2t |
第六站 | 3a+5t | 2a+3t | a+2t | 4a+4t |
第七站 | 5a+8t | 3a+5t | 2a+3t | 6a+7t |
第八站 | 8a+13t | 5a+8t | 3a+5t | 9a+12t |
通过观察表格中加星号的两列不难看出考察斐波那契数列的意图
处理本题主要依靠找出a的系数的变化规律以及t的系数的变化规律
此题目找到规律之后十分简单
代码如下
#include<stdio.h>
int xishu(int a,int n,int m,int x)
{
int aa[25],tt[25],ff[25],t,i,s;
ff[0] = 0;
ff[1] = 1;
ff[2] = 1;
for(i=3;i<=24;i++){
ff[i] = ff[i-1]+ff[i-2];//斐波那契数列
//printf("%d ",ff[i]);
}
aa[0] = 0;
aa[1] = 1;
aa[2] = 1;
aa[3] = 2;
for(i=4;i<=24;i++){
aa[i] = aa[i-1]+ff[i-4];//a前的系数
}
tt[0] = 0;
tt[1] = 0;
tt[2] = 0;
tt[3] = 0;
for(i=4;i<=24;i++){
tt[i]=tt[i-1]+ff[i-3];//t前的系数
//printf("%d",tt[i]);
}
t=(m-aa[n-1]*a)/tt[n-1];
printf("%d",(a*aa[x]+t*tt[x]));
//巧妙运用系数来求未知数
}
int main()
{
int a,n,m,x;
scanf("%d",&a);
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&x);
xishu(a,n,m,x);
return 0;
}