书架排列问题(区间查询)
大家好am是金奇人生话不多说讲题吧说明在一个图书馆整理活动中管理员需要将两种颜色的书籍红色和蓝色排列在书架上。规则如下1.蓝色书籍每次必须连续摆放恰好 k 本。2.红色书籍每次可以单独摆放也可以连续摆放任意数量。管理员需要计算书架长度在 [lr] 范围内的所有合法排列方案数结果对1097 取模。输入格式第一行包含两个整数 $t$ 和 $k$$1 \le t \le 1e51 \le k \le 1e5$表示测试用例数量和每组蓝色书籍的固定长度。接下来 t 行每行包含两个整数 l 和 r1≤l≤r≤1e6表示查询的区间。输出格式对于每个查询输出一个整数表示合法方案数模 $10^97$ 的结果。输入样例13 2 1 3 2 3 4 4输出样例16 5 5提示样例解释当 k2 时长度为 1 时只能是红色书籍1 种。长度为 2 时可能是 RR 或 BB2 种。长度为 3 时可能的组合有 RRR、RBB、BBR3 种总共有 1236 种。数据范围50% 数据 t≤100,1≤l≤r≤1e5100% 数据 t≤1000000,1≤l≤r≤1e6#includebits/stdc.h using namespace std; int t,k,f[1000005]; int qian[1000005]; int main() { cintk; f[0]1; for(int i1; i1000000; i){ f[i]f[i-1]; if(ik)f[i](f[i]f[i-k])%1000000007; } for(int i1; i1000000; i) qian[i](qian[i-1]f[i])%1000000007; int l,r; while(t--){ cinlr; cout(qian[r]-qian[l-1]1000000007)%1000000007endl; } return 0; }1. 状态定义与转移方程我们需要计算长度为 ii 的书架有多少种合法排列设数组f[i]表示这个数量。对于长度为 ii 的书架最后放置的书只有两种情况‌以红色书结尾‌红色书可以单独放也可以连续放。如果最后一位是红色那么前 i−1i−1 位只要是合法排列即可。因此这种情况贡献的方案数是f[i-1]。‌以蓝色书结尾‌题目规定蓝色书必须‌恰好连续摆放 kk 本‌。这意味着如果书架以蓝色结尾那么最后 kk 个位置必须全部是蓝色且这 kk 本蓝色书作为一个整体其前面的 i−ki−k 个位置必须是合法排列。因此这种情况贡献的方案数是f[i-k]前提是 i≥ki≥k。综合起来状态转移方程为f[i]f[i−1]f[i−k](当 i≥k)f[i]f[i−1]f[i−k](当 i≥k)f[i]f[i−1](当 ik)f[i]f[i−1](当 ik)‌边界条件‌f 1。这代表长度为 0 时有一种“空”的方案。这是为了处理当 ikik 时直接放置一组蓝色书的情况即f[k] f。2. 前缀和优化题目要求查询区间 [l,r][l,r] 内所有长度方案数的总和。如果每次查询都循环累加效率太低。我们可以预处理一个前缀和数组qianqian[i]∑j1if[j]qian[i]∑j1i​f[j]这样对于每次查询 [l,r][l,r]答案就是Answerqian[r]−qian[l−1]Answerqian[r]−qian[l−1]注意在模运算中减法可能导致负数所以需要写成(qian[r] - qian[l-1] MOD) % MOD。3. 代码实现#includebits/stdc.h using namespace std; int t,k,f; int qian; int main() { cintk; f[0]1; // 第一步动态规划计算每个长度的方案数 f[i] for(int i1; i1000000; i){ f[i]f[i-1]; // 情况1最后放一本红色书 if(ik) f[i](f[i]f[i-k])%1000000007; // 情况2最后放 k 本蓝色书 } // 第二步计算前缀和 qian[i] for(int i1; i1000000; i) qian[i](qian[i-1]f[i])%1000000007; int l,r; // 第三步处理查询 while(t--){ cinlr; // 利用前缀和差分计算区间和注意处理负数取模 cout(qian[r]-qian[l-1]1000000007)%1000000007endl; } return 0; }关键点总结‌f1的作用‌它是递推的基石。例如当 ikik 时f[k]会加上f这代表了“前0本书合法紧接着放k本蓝书”这一种情况。‌模运算处理‌在累加f[i]和计算前缀和时都要随时取模防止整数溢出。最后在输出结果时通过 1000000007确保减法结果为非负数。‌时间复杂度‌预处理部分为 O(N)O(N)每次查询为 O(1)O(1)总复杂度为 O(NT)O(NT)完全满足 N10,T10N10,T10 的数据范围要求。求关注来之不易......

相关新闻

[封装科普] 芯片先进封装解析:SiP 架构、PoP 焊接工艺与后段封装核心技术

[封装科普] 芯片先进封装解析:SiP 架构、PoP 焊接工艺与后段封装核心技术

在芯片小型化与高集成度的发展趋势下,SiP 和 PoP 等先进封装技术成为了硬件工程设计的核心。本文将从核心定义、工艺辨析到高阶制造流程,对相关封装技术进行系统性梳理。一、 SiP (系统级封装) 的本质与内部架构SiP (System in Package) 的核心并非“封装…

2026/9/11 8:11:38 阅读更多 →
AI智能体事故追踪:从数据模型到工程落地的全链路实践

AI智能体事故追踪:从数据模型到工程落地的全链路实践

在实际 AI 应用开发与部署中,一个日益凸显的挑战是:当 AI 智能体(Agent)在生产环境中出现意外行为或造成不良后果时,我们如何系统性地追踪、记录、分析和归因?这不仅仅是技术问题,更是一个涉及工…

2026/9/6 6:12:32 阅读更多 →
开源船舶管理系统OpenShip:从架构设计到二次开发实战

开源船舶管理系统OpenShip:从架构设计到二次开发实战

1. 项目概述:为什么我们需要一个开源的船舶管理方案?如果你在航运、物流或者船舶相关的科技公司待过,大概率会对那些昂贵、封闭且迭代缓慢的船舶管理软件印象深刻。动辄数十万甚至上百万的授权费用,复杂的定制化流程,以…

2026/9/11 12:33:52 阅读更多 →

最新新闻

RAG 重排序实测:双编码召回 + CrossEncoder 精排,500 条真实查询上的收益与代价

RAG 重排序实测:双编码召回 + CrossEncoder 精排,500 条真实查询上的收益与代价

本文是「RAG 链路实测」第 2 篇 上篇:RAG 分块策略实测 后端做了多年了,推荐、搜索都碰过,对这套分层不陌生:召回用便宜的向量检索把十万候选筛到几百,精排用贵的模型把几百排到几十。RAG(检索增强生成&am…

2026/9/12 19:41:16 阅读更多 →
从零实现 C++ AI 大模型接入 SDK(二):项目演示、环境搭建与 ChatSDK 快速上手

从零实现 C++ AI 大模型接入 SDK(二):项目演示、环境搭建与 ChatSDK 快速上手

目录 一、先看一下最终项目效果 1.1 启动 AIChatServer 1.2 打开网页聊天界面 1.3 实际发送一条消息 二、开发环境搭建 2.1 本系列采用的开发方式 2.2 安装 Trae 并连接远程服务器 2.3 clangd 和 CMake Tools 三、安装项目需要的第三方依赖 3.1 先看项目到底依赖什么…

2026/9/12 19:41:16 阅读更多 →
Python验证码生成与安全防护实战指南

Python验证码生成与安全防护实战指南

1. Python 图片验证码库核心选型指南验证码作为现代Web应用的基础安全组件,其重要性不言而喻。Python生态中有多个成熟的验证码生成库,每个都有其特定的适用场景和技术特点。以下是经过实战检验的四大主流选择:1.1 captcha库:轻量…

2026/9/12 19:41:16 阅读更多 →
218、【AI】【模型部署】Notebook 源码拆解:输出 data 的多格式与前端择优渲染

218、【AI】【模型部署】Notebook 源码拆解:输出 data 的多格式与前端择优渲染

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 标题 218、【AI】【模型部署】Notebook 源码拆…

2026/9/12 19:41:16 阅读更多 →
非线性模型预测控制(NMPC)原理与Matlab实现

非线性模型预测控制(NMPC)原理与Matlab实现

1. 非线性模型预测控制(MPC)基础解析 非线性模型预测控制(Nonlinear Model Predictive Control, NMPC)是传统MPC在非线性系统领域的自然延伸。与线性MPC相比,NMPC能够更精确地描述现实世界中普遍存在的非线性动态特性。…

2026/9/12 19:41:16 阅读更多 →
qwen-code ACP Session 初始化超时取消机制:从 Bridge 到 Agent 的 Deadline 全链路设计与实现

qwen-code ACP Session 初始化超时取消机制:从 Bridge 到 Agent 的 Deadline 全链路设计与实现

qwen-code ACP Session 初始化超时取消机制:从 Bridge 到 Agent 的 Deadline 全链路设计与实现 【免费下载链接】qwen-code An open-source AI coding agent that lives in your terminal. 项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code 导读…

2026/9/12 19:40:15 阅读更多 →

日新闻

道路直播实战指南:从选点设备到安全运营,打造有温度的路况慢直播

道路直播实战指南:从选点设备到安全运营,打造有温度的路况慢直播

我做了半年多的道路直播,从零粉丝的冷清画面,到高峰期几千人同时在线看一个路口,最大的体会就八个字:以安全为基,藏温暖于行。道路直播这个赛道,看着是架个摄像头对着马路,真正做起来才发现&…

2026/9/12 0:00:03 阅读更多 →
AutoHedge:自动化对冲交易系统的架构设计与实战落地

AutoHedge:自动化对冲交易系统的架构设计与实战落地

AutoHedge这个词,拆开看就是两个单词:自动和对冲。我在交易这行混了十来年,见过太多人死在没有纪律的对冲执行上——行情来了手忙脚乱,计算器还没按完,价差已经跑没影了。所以当我决定把“对冲”这件事彻底交给代码时&…

2026/9/12 0:00:03 阅读更多 →
DnCNN与BM3D对比:图像去噪原理及MATLAB实战

DnCNN与BM3D对比:图像去噪原理及MATLAB实战

简介:面向图像去噪算法研究与毕业设计场景的完整MATLAB仿真项目,集合均值滤波、中值滤波、非局部均值(NLM)、三维块匹配(BM3D)等传统算法,以及基于深度卷积神经网络的DnCNN去噪模型,…

2026/9/12 0:00:03 阅读更多 →

周新闻

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 0:04:23 阅读更多 →
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 17:11:40 阅读更多 →
基于CNN的调制信号识别:MATLAB实现时频图分类实战

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 8:03:07 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/9 7:36:02 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →