洛谷 P1011 车站 (斐波那契数列,水题)

这篇博客探讨了洛谷P1011题目,涉及斐波那契数列的应用。通过分析,将车站上车人数问题转化为一元一次方程求解。关键点包括前缀和计算以及如何利用递推关系找到答案。对于车站1和2,可以直接得出上车人数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

斐波那契数列,水题
题目的意思,就是要解 一元一次方程。
第 n - 1 个车站上的总人数,和 第1 个车站上车人数 a1 和 第2个车站的上车人数有关。
数组 a1[k] 表示 第k个车站,上车的旅客人数,包含 a1 的多少倍。
数组 a2[k] 表示 第k个车站,上车的旅客人数,包含 a2 的多少倍。
第 n - 1 车站,总人数为 m, 因此算出表达式 a1 * u + a2 * v == m.
这个方程 a1 == a, m 已知, u 和 v 由递推关系算出来, 然后方程变成了 一元一次方程。
解 出 a2

本题要点:
1、 前缀和 s1[k], 表示 第k 个车站总人数, 包含 a1 多少倍。
2、 a1, a2 都已知, 题目要求求出第x 个车站 的总人数,再根据前缀和,很容易算出
第 x 个车站的总人数。
3、x的范围 1 ~ n - 1, 对于 车站 1, 2, 直接输出 a.

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 21;
int a1[MaxN], a2[MaxN], s1[MaxN], s2[MaxN];
int a, n, m, x;

int main()
{
	scanf("%d%d%d%d", &a, &n, &m, &x);
	a1[1] = 1, a1[2] = 0, a2[1] = 0, a2[2] = 1;
	s1[1] = s1[2] = 1,  s2[1] = 0, s2[2] = 1;
	if(n == 1 || n == 2)
	{
		printf("%d\n", a);
		return 0;
	}
	for(int i = 3; i <= n - 3; ++i)
	{
		a1[i] = a1[i - 1] + a1[i - 2];
		s1[i] = s1[i - 1] + a1[i];
		a2[i] = a2[i - 1] + a2[i - 2];
		s2[i] = s2[i - 1] + a2[i];
	}
	int t = (m - s1[n - 3] * a - a) / s2[n - 3]; 
	printf("%d\n", s1[x - 2] * a + a + s2[x - 2] * t);
	return 0;
}

/*
5 7 32 4
*/

/*
13
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值