上下火车
时间限制: 1 Sec 内存限制: 125 MB提交: 26 解决: 14
[提交][状态][讨论版][命题人:外部导入]
题目描述
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
输入
每个测试文件只包含一组测试数据,每组输入四个整数a、n、m和x。
输出
对于每组输入数据,输出从x站开出时车上的人数。
样例输入
5 7 32 4
样例输出
13
提示
解析:
车站编号: 1 2 3 4 5 6 7
上车人数 a b a + b a + 2*b 2*a+3*b 3*a+5*b ......
下车人数 0 b b a + b a+2*b 2*a+3*b ......
剩下的人数 a a 2 * a 2*a + b 3*a+2*b 4*a+4*b ......
用表易得:上车人数=fib( n - 3 ] + fib( n - 2 ) == m;
剩下的人数=( fib( x - 2 ) + 1 ) *a + (fib( x - 1 ) + 1 ) * b;
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1005;
int num[ maxn ], fib[ maxn ];
int main()
{
int n, a, m, x, b;
fib[ 0 ] = 0;
fib[ 1 ] = 1;
for( int i = 2; i < maxn; ++i )
fib[ i ] = fib[ i - 1 ] + fib[ i - 2 ];
while( cin >> a >> n >> m >> x )
{
// m = ( fib[ i - 2 ] + 1 ) * a + ( fib[ i - 1 ] - 1 ) * b;
b = ( m - ( fib[ n - 3 ] + 1 ) * a ) / ( fib[ n - 2 ] - 1 );
long long ans = ( fib[ x - 2 ] + 1 ) * a + ( fib[ x - 1 ] - 1 ) * b;
cout << ans << endl;
}
return 0;
}