p.s.个人收录用
题目描述
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
输入
a(≤20),n(≤20),m(≤2000),和x(≤20),
输出
从x站开出时车上的人数。无解则输出No answer.
样例输入 Copy
5 7 32 4
样例输出 Copy
13
列举
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
上车人数 | a | b | a+b | a+2b | 2a+3b | 3a+5b | 0 |
下车人数 | 0 | b | b | a+b | a+2b | 2a+3b | m |
上下车人数差 | a | 0 | a | b | a+b | a+2b | m |
总人数 | a | a | 2a | 2a+b | 3a+2b | 4a+4b | 0 |
p.s.注意到a与b的系数符合斐波那契数列
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <string.h>
//火车站
int f[100] = { 0 };//斐波那契数列
int a, n, m, x;
int fa(int n)
{
if (f[n])
return f[n];
f[n] = fa(n - 1) + fa(n - 2);
return f[n];
}
int main()
{
scanf("%d%d%d%d", &a, &n, &m, &x);
f[0] = 0; f[1] = 1; f[2] = 1;
fa(n);
if (x == 1 || x == 2)
printf("%d\n", a);
else if (x == 3)
printf("%d\n", 2 * a);
else
{
double b = (m - (f[n - 3] + 1) * a) * 1.0 / (f[n - 2] - 1);//第二站上下车的人数
if (b == (int)b)
printf("%d\n", a * (f[x - 2] + 1) + (int)b * (f[x - 1] - 1));
else
printf("No answer.\n");
}
}