火车上的人数 | ||||||
| ||||||
Description | ||||||
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。 从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。 现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。 试问x站开出时车上的人数是多少? | ||||||
Input | ||||||
有多组测试数据。 每组测试数据仅包含一行,每行包括四个整数,a,n,m和x。 0<= a <= 10 3<= n <= 30 1 <= x < n 0 <= m <= 2^31-1 | ||||||
Output | ||||||
对于每组测试数据,输出一行,包括一个整数,即从x站开出时车上的人数。 | ||||||
Sample Input | ||||||
5 7 32 4 | ||||||
Sample Output | ||||||
13 |
我们模拟手算,发现上车的人数和下车的人数都成一种f【0】,f【1】数据不一定的斐波那契数列,枚举出几个样例就不难发现。问题所在就是数学问题,求出第二次上车的人数是关键,因为数据比较小,所以我们这里采用枚举它的模式来做题,
因为数据比较小,可以用暴力枚举的方法,其实这种题应该是放大数据,然后用矩阵快速幂啥的求斐波那契数,相对提升难度~
#include<stdio.h>
#include<string.h>
int main()
{
int a,n,m,x,i,y;
int on[31],off[31],ans[31];
while(~scanf("%d%d%d%d",&a,&n,&m,&x))
{
y=1;
memset(ans,0,sizeof(ans));
on[1]=a;ans[1]=a;off[1]=0;
while(ans[n-1]<=m)
{
on[2]=y;off[2]=y;ans[2]=a;
for(i=3;i<n;i++)
{
on[i]=on[i-1]+on[i-2];
off[i]=on[i-1];
ans[i]=ans[i-1]+on[i-2];
}
if(ans[n-1]==m)
{printf("%d\n",ans[x]);break;}
y++;
}
}
}