上下火车(斐波那契)

上下火车

时间限制: 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;  
}  
原文地址:https://www.cnblogs.com/caiyishuai/p/8577179.html