P1011 [NOIP1998 提高组] 车站 (用方程解斐波那契数列)

2023-05-16

[NOIP1998 提高组] 车站

题目描述

火车从始发站(称为第 1 1 1 站)开出,在始发站上车的人数为 a a a,然后到达第 2 2 2 站,在第 2 2 2 站有人上、下车,但上、下车的人数相同,因此在第 2 2 2 站开出时(即在到达第 3 3 3 站之前)车上的人数保持为 a a a 人。从第 3 3 3 站起(包括第 3 3 3 站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第 ( n − 1 ) (n-1) (n1) 站),都满足此规律。现给出的条件是:共有 n n n 个车站,始发站上车的人数为 a a a ,最后一站下车的人数是 m m m(全部下车)。试问 x x x 站开出时车上的人数是多少?

输入格式

输入只有一行四个整数,分别表示始发站上车人数 a a a,车站数 n n n,终点站下车人数 m m m 和所求的站点编号 x x x

输出格式

输出一行一个整数表示答案:从 x x x 站开出时车上的人数。

样例 #1

样例输入 #1

5 7 32 4

样例输出 #1

13

提示

对于全部的测试点,保证 1 ≤ a ≤ 20 1 \leq a \leq 20 1a20 1 ≤ x ≤ n ≤ 20 1 \leq x \leq n \leq 20 1xn20 1 ≤ m ≤ 2 × 1 0 4 1 \leq m \leq 2 \times 10^4 1m2×104

解题思路

根据题目描述,可以先打表观察题目给出的数据的规律
在这里插入图片描述
可以看出,净上车人数从第3站开始满足斐波那契数列规律。但是k是一个未知数,所以要通过解方程的方式来求出k。
假设最后求出从 n − 1 n-1 n1站驶离时车上人数为 λ a + ξ k \lambda a+\xi k λa+ξk,则该值等于n站下车人数m。即 λ a + ξ k = m \lambda a+\xi k=m λa+ξk=m
求出在x站驶离时车上人数为 α a + β k \alpha a+\beta k αa+βk,此时将k代入即可。
用结构体 来表示每一站的净上车人数为 x a ∗ a + x k ∗ k x_a*a+x_k*k xaa+xkk,只需要存储系数即可。

struct sta {
	int xa = 0;
	int xk = 0;
	sta operator+(sta rhs) {
		sta re;
		re.xa = this->xa + rhs.xa;
		re.xk = this->xk + rhs.xk;
		return re;
	}
};

代码如下

#include<iostream>
#include<vector>

using namespace std;

struct sta {
	int xa = 0;
	int xk = 0;
	sta operator+(sta rhs) {
		sta re;
		re.xa = this->xa + rhs.xa;
		re.xk = this->xk + rhs.xk;
		return re;
	}
};
int main() {
	int a, n, m, x;
	cin >> a >> n >> m >> x;
	if (x == 1) {
		cout << a << endl;
		return 0;
	}
	 if (x == 2) {
		cout << a << endl;
		return 0;
	}
	 if (x == n) {
		 cout << 0 << endl;
		 return 0;
	 }
	 if (x == 3) {
		 cout << a * 2 << endl;
		 return 0;
	}
	 
	vector<sta> dp(n + 1, {0,0});
	dp[1] = { 1,0 };
	dp[2] = { 0,0 };
	dp[3] = { 1,0 };
	dp[4] = { 0,1 };
	sta count{ 2,1 };
	sta countx{ 2,1 };

	for (int i = 5; i <= n-1; i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
		count = count + dp[i];
		if (i <= x)
			countx = countx + dp[i];
	}

	//cout << count.xa << " " << count.xk << endl;
	int k = m - count.xa * a;
	k /= count.xk;

	//cout << "k" << k << endl;
	cout << countx.xa * a + countx.xk * k << endl;



}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

P1011 [NOIP1998 提高组] 车站 (用方程解斐波那契数列) 的相关文章

  • 芯片春秋: 开源架构RISC-V前世今生

    不久前 xff0c 特斯拉加入 RISC V基金会 xff0c 并考虑在新款芯片中使用免费的 RISC V 设计 至此 xff0c 已有IBM NXP 西部数据 英伟达 高通 三星 谷歌 华为等100多家科技公司加入RISC V阵营 出现这
  • 华为设备配置——配置通过FTP进行文件操作

    1 实验原理 FTP xff08 File Transfer Protocol xff0c 文件传输协议 xff09 是 TCP IP 协议组中的协议之一 其主要功能是向用户提供本地和远程主机之间的文件传输 xff0c FTP采用C S x
  • Linux学习笔记

    Linux linux的本质是一切皆目录 学习来自哔哩哔哩狂神说 xff0c 视频地址https www bilibili com video BV187411y7hF hostnamectl xff1a 查看linux信息 关机 shut
  • Linux .deb包的安装(gdebi)

    一些废话 deb包可以通过传统的dpkg命令来实现 xff0c 但过程中经常会遇到一些问题 所以有个软件叫GDebi xff0c 可以更加有效的帮助安装deb 通过点击deb包即可实现安装 xff0c 当然 xff0c 也可以通过命令行模式
  • 简单的理解EKF算法1

    简单的理解EKF算法 经典的EKF公式简化版的EKF公式参考资料 经典的EKF公式 来我们先来看一下第一眼看上去不知道在讲啥的公式 1 x k 61 A
  • Myeclipse/Eclipse 如何停止死循环进程

    今天在在练习hibernate 对象导航查询的时候想输出一对多 xff08 客户1 联系人n xff09 关系里面想输出某个客户的所有联系人 xff0c 便用Iterator对set进行遍历 xff0c 顺便看看iterator里面的方法具
  • 如何快速解决zookeeper闪退问题!

    有以下2种情况 xff1a 第一种方法 xff1a 按任意键直接闪退 xff0c 这时我们只需要修改一下配置文件即可 xff0c 右键 zkServer cmd xff0c 编辑文件内容 xff0c 在末尾输入 pause 保存并退出 在双
  • Centos6.8更新yum

    一 重新安装 1 卸载yum CentOS6停止维护更新日期2020年11月30日 下架了包括官方所有的CentOS6源 xff08 包括国内的镜像站 xff09 span class token comment 查看yum span rp
  • Debian 10系统最小化安装

    Debian 10最小化安装 一 Debian系统介绍 广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品 xff0c 由于Debian项目众多内核分支中以Linux宏内核为主 xff0c 而且 Debian开发者 所创建的
  • 在Ubuntu16.04系统下安装Python3.6 + pip3 的完整步骤

    python gt 垃圾垃圾真垃圾 xff08 开玩笑的 xff09 Ubuntu16 04版本最新的Python 3 x为版本3 5 1 要安装Python 3 6 xff0c 请运行以下命令 xff1a wget https www p
  • Ubuntu中的中文字体设置

    首先我们要搞清楚我们要设置的是系统的字体还是Firefox中的字体 一 设置的是Firefox浏览器中的字体 我们只需要在点击浏览器右上角Open menu gt Preferences gt Content gt Fonts amp Co
  • 详解叠瓦式磁记录SMR盘基础知识

    SMR Shingled Magnetic Recording 叠瓦式磁记录盘 是一种采用新型磁存储技术的高容量磁盘 SMR盘将盘片上的数据磁道部分重叠 xff0c 就像屋顶上的瓦片一样 xff0c 这种技术被称为叠瓦式磁记录技术 该技术在
  • 如何将c++中utf-16编码的字符串(wstring)转为utf-8(string)?

    最近使用到了mysql connector cpp xff0c 通过这个库获取到的字符串类型是mysql string xff0c 其实其实质就是mysql自己实现的wstring 如果直接进行转换 xff1a mysqlx span cl
  • FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ‘:app:stripDe

    文章目录 问题描述解决方法 问题描述 android studio 编译2012 年的项目时出现了如下问题 xff1a FAILURE Build failed with an exception What went wrong Execu
  • 学习C++:使用C++11实现阻塞队列

    目录 1 代码 1 代码 span class token macro property span class token directive keyword ifndef span BLK QUEUE H span span class
  • Scoop安装遇到 “raw.githubusercontent.com未能解析” 解决方案

    想试试windows包管理器Scoop xff0c 但安装总是报错 xff1a iwr 未能解析此远程名称 39 raw githubusercontent com 39 所在位置 行 1 字符 1 43 iwr useb get scoo
  • Looking in indexes: xxx WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None

    docker 构建python程序报错 Step span class token number 7 span 10 span class token builtin class name span RUN pip3 span class
  • 通过github pages将自己的域名解析到csdn博客

    刚发表了一篇博客 发现做个人工作总结挺好用 鉴于研究生期间每周都要做周总结 xff0c 以后就每周用csdn博客来做总结草稿好了 现在用之前购买的域名来解析到个人博客以便于自己和其他人浏览 总结如下 xff1a 1 申请域名songweib
  • SecoClient在win10系统中连接失败解决方案

    官方的解决方案 xff1a 官方解决方案 解决过程中时遇到的可参考的解决方案 xff1a 可参考的解决方案 以上方案都无法解决的情况下的个人经历 xff1a 1 下午时不断尝试使用SecoClient进行连接但得到的提示都是如下图这样的警告
  • 修复win10启动项

    使用bcdboot修复win10启动项 修复前计算机状态 xff1a 只有win10系统分区 xff0c 没有EFI分区 步骤 xff1a 1 使用DiskGenius创建一个100MB的EFI分区 2 关闭计算机 xff0c 插入系统盘

随机推荐