CF1716D 题解

news/2026/1/21 20:01:44/文章来源:https://www.cnblogs.com/aaalys/p/19513917

Codeforces 1716D Chip Move 题解

此文章已同步在洛谷上更新

题目大意

洛谷题面
如果想看英文题面请去 CF
给定两个数 \(n,k\),问从 \(0\) 开始,第 \(i\) 步只能走 \((k+i-1)\) 的正倍数(即不能走 \(0\)),问分别走到 \(x\in[1,n]\) 的方案数,对 \(998244353\) 取模。

思路

第一步:将原问题转化成背包

看到第 \(i\) 步只能走 \((k + i - 1)\) 的整倍数,不难发现和完全背包很类似。
可以把第 \(i\) 步看做只能走 \((k + i - 1)\),但是能走无限次。
这样就能把这个问题转化成一个完全背包问题:有 \(n\) 个物品,第 \(i\) 个物品重量为 \((k + i - 1)\),每个物品最少取一个(因为题目中说不能走 0)问你总重量为 \(x\in[1,n]\) 的取法数。

第二步:设计状态

但这个问题不是裸的完全背包板子,因为原问题是求最大收益,现在的问题是求方案数。
所以现在需要用完全背包的状态修改一下。
完全背包的状态:设 \(dp_{i,j}\) 为到第 \(i\) 个物品,总重量为 \(j\) 时的最大收益。
现在只要修改一点,把最大收益改成方案数就行。
现在的状态:设 \(dp_{i,j}\) 为到第 \(i\) 个物品,总重量为 \(j\) 时的方案数。

第三步:转移方程

原来的完全背包转移方程是 \(dp_{i,j} = \max(dp_{i-1,j}, dp_{i,j-w_i} + v_i)\)
现在需要在原来的基础上修改几点:

  • 把原方程转换成统计方案的形式
  • 把原来的 \(dp_{i-1,j}\) 删去,不能转移,每个物品最少取一个。
  • 因为没有了 \(dp_{i-1,j}\),所以统计 \(dp_{i,j}\) 时需要加上 \(dp_{i-1,j-w_i}\)
  • 需要把方程中的 \(w_i\) 替换成 \((k+ i - 1)\)

现在的转移方程就变成了 \(dp_{i,j} = dp_{i,j-(k+i-1)} + dp_{i-1,j-(k+i-1)}\)

初始状态与答案

初始时没有开始选,即选到第 0 个物品,总重量为 0,但是有一种方法(什么也不选)。
初始状态是 \(dp_{0,0} = 1\)
由于在原题中走几步到达终点都算答案,所以统计最终答案时要加上每一个 \(i\) 对应的 dp 值。
答案为 \(ans_x = \sum_{i=1}^n{f_{i,x}}\)

代码实现

实现细节

建议看完此部分后再看代码。

细节 1:时间优化

按照这种方法,时间复杂度为 \(O(n^2)\),无法通过此题,考虑优化。
第二维总重量无法优化,只能优化第一位物品个数。
因为每种物品最少取一个,所以按照取一个计算,这样能让总重量最少。
要让总重量 \(\le n\),也就是让 \(\sum_{i=1}^x{(k + i - 1)}\le n\)
解得 \(x \le \sqrt{2n}\),也就是说最多取 \(\sqrt{2n}\) 个物品就能取完 \(n\) 的容量,因此 \(i\) 只用枚举到 \(\sqrt{2n}\) 就行。
优化后的时间复杂度为 \(O(n \sqrt{n})\)

细节 2:滚动数组优化

如果直接用上面的状态,那空间复杂度为 \(O(n \sqrt{n})\),无法通过此题(开 int 数组需要用 360MB 的空间)。
考虑将第一维滚动掉。
但是这里不能直接压掉一维,需要在第一维再开一个 0/1 表示这轮和上轮的 dp 值。
所以需要再开一个变量 now,表示当前的 dp 值存在 \(dp_{now,i}\) 里。那上一轮的 dp 值就存在 \(dp_{now \oplus 1,i}\) 里。
每次转移的时候需要让 \(now \gets now \oplus 1\),也就是让当前的 dp 值变成下一轮的上一轮的 dp 值。
转移方程也要进行一些改动,变成 \(dp_{now,j} = dp_{now,j-(k+i-1)} + dp_{now \oplus 1,j-(k+i-1)}\)
优化后的空间复杂度为 \(O(n)\)

细节 3:统计答案

由于滚动数组无法记录所有状态,所以不能在最后统计最终答案,而是要在 dp 过程中累加答案。
也就是在 dp 的过程中将 \(ans_j\) 累加上 \(dp_{now,j}\)

一些坑点

  • 记得取模。
  • \(n,k\) 的范围是 \(1 \le n,k \le 2\cdot10^5\),不是 \(1 \le n,k \le 10^5\)
  • 记得要及时清空数组(不然会 WA)。
  • 其他的注意事项可以看代码注释

Code(只展示关键代码)

f[0][0] = 1;//初始值
int now = 0;
for (int i = 1; i * i <= n * 2; i++){//i枚举到sqrt(2*n)now ^= 1;for (int j = i * k + i * (i - 1) / 2; j <= n; j++)//取前i个物品,最少总重量为ik+i*(i-1)/2(读者自行推导),所以j从ik+i*(i-1)/2开始(f[now][j] += f[now][j - (k + i - 1)] + f[now ^ 1][j - (k + i - 1)]) %= mod;//转移memset(f[now ^ 1], 0, sizeof(f[now ^ 1]));//注意:要清空数组for (int j = 1; j <= n; j++)//累加答案(ans[j] += f[now][j]) %= mod;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1196113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Windows] 文件名精灵2025 批量修改文件名工具

[Windows] 文件名精灵2025 批量修改文件名工具 链接&#xff1a;https://pan.xunlei.com/s/VOjVKTcShvWTz972rnxzJB_RA1?pwdvywy# 在日常办公和文件管理中&#xff0c;批量修改文件名是高频需求&#xff0c;而一款高效、功能全面的工具能大幅提升效率。文件名精灵 2025 作为…

2025秋 别样的挂分大战

09.06 先开 T1,发现把每个特殊串离散化完了再直接做 LIS 板子就是 \(O(n^2)\),光速写完。 开 T2,发现是最优化,扫了一眼数据范围,感觉很贪心,但是不太会所以跳了。 开 T3,这不是建完前缀和再直接用树状数组做二…

PCIe从入门到精通之十八:PCIe设备的初始化枚举过程2

0&#xff0c;引言 在上一篇文章《PCIe从入门到精通之十七&#xff1a;PCIe设备的初始化枚举过程1》中&#xff0c;我们介绍了PCIe设备的初始化枚举过程一些概念.这一篇我们将具体介绍PCIe设备的初始化枚举一步一步的动态过程&#xff0c;以及Primary Bus Number Register&…

CF1615B 题解

Codeforces 1615B And Its Non-Zero 题解 题目传送门: 洛谷 CF 思路 暴力思路 要让所有元素按位与的结果不为 \(0\),就要让所有元素在二进制的某一位都为 \(1\)。 所以我们可以枚举每个二进制位,看看有几个 \(0\),…

1.hello驱动

1.怎么写驱动程序确定主设备号 定义自己的file_operations结构体 实现对应的open/read/write等函数,填入file_operations结构体 把file_operations结构体告诉内核:注册驱动程序(register_chrdev(major, file_operat…

2025冬 超级无敌挂分大王

11.12 分层测试~ 开 T1,MST 板题?写了一下,最后用大法师求根到点的边权和。炸。瞎改了一堆。炸炸炸。 无语,滚去 T2。怎么是类 CSPS T1,瞎猜了个基于优先队列的贪心,因为不会写堆所以改写线段树,胡写了一下,大…

文科核心期刊发表指南:AI助力高效投稿

8大文科论文查重工具核心对比 排名 工具名称 查重准确率 数据库规模 特色功能 适用场景 1 Aicheck 98% 10亿文献 AI降重、AIGC检测 初稿查重与修改 2 Aibiye 96% 8亿文献 智能改写、格式调整 终稿精细优化 3 秒篇 95% 6亿文献 一键生成降重报告 快速查…

Agentic-KGR:多智能体强化学习驱动的知识图谱本体渐进式扩展技术

Agentic-KGR是一种通过多轮强化学习驱动的多智能体交互实现知识图谱本体渐进式自进化的技术框架。该框架遵循"提取→暂存→更新→奖励计算→晋升"的闭环流程&#xff0c;依赖LLM的知识发现能力和反馈闭环机制。系统通过多尺度提示压缩、Neo4j数据库管理、分层决策机制…

教师必看!国内发成绩小程序大盘点

教师必看!国内发成绩小程序大盘点引言:成绩发布痛点与小程序崛起 每到期中期末考试结束,便是老师们的 “成绩发布攻坚战”。传统的成绩发布方式,简直是问题百出。手动录入成绩,那密密麻麻的数字,一不留神就可能输…

瞬维智能:房产获客的精准革命,让每一份投入都开出确定的花

在房产行业摸爬滚打的人&#xff0c;都曾经历过这样的时刻&#xff1a;深夜对着电脑屏幕&#xff0c;反复修改房源文案却始终触不到那个“对的人”&#xff1b;或是花费大量人力物力制作的内容&#xff0c;最终却石沉大海&#xff0c;连个水花都没溅起。 瞬维智能的AI获客智能体…

学Simulink--电机控制架构与算法实现​场景示例:基于Simulink的电机电流环PI参数整定仿真

目录 手把手教你学Simulink 一、引言:为什么“调不好PI”会让高性能电机变成“抖动机器”? 二、核心原理:电流环的“等效传递函数”建模 1. 电流环简化模型(d/q轴解耦后) 2. 数字控制系统中的关键延迟 3. 电流环闭环结构 三、应用场景:伺服驱动器中的高性能电流环设…

稀土合金回收利用:资源闭环新路径,产业盈利与环保双赢

稀土被誉为“现代工业的维生素”,稀土合金更是新能源、航空航天、高端制造领域的核心材料,不可或缺。但原生稀土储量有限、开采污染大,随着全球稀土需求激增,稀土合金回收利用已成为缓解资源缺口、践行双碳目标、提…

P6822 [PA 2012 Finals] Tax 题解

题目大意 可恶,我们老师竟然把紫题放到了模拟赛里。 题目传送门 原题中题意说的很清楚了。 思路 转化问题 首先先新建两条边,使原题点到点的问题转化成边到边的问题。 可以连接一条从 \(0\) 到 \(1\),长度为 \(0\) …

基于Springboot+Vue的校园二手书交易系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对校园内二手书流转不畅、交易信息分散、供需对接低效、交易安全缺乏保障等痛点&#xff0c;设计并实现基于SpringbootVue的校园二手书交易系统&#xff0c;构建集图书发布、检索匹配、在线沟通、交易履约于一体的数字化校园交易平台。系统以MySQL为数据存储核…

UVA1464 Traffic Real Time Query System 题解

UVA1464 Traffic Real Time Query System 题解 题目大意 题目传送门 给出一张 \(n\) 个点,\(m\) 条边的无向连通图,问从第 \(s\) 条边到第 \(t\) 号边必须经过多少点。题目有多组数据。 思路 转换问题 这道题类似于 …

基于Springboot+Vue的校园家教信息平台的设计开发(源码+lw+部署文档+讲解等)

课题介绍 本课题针对校园内家教供需信息不对称、对接效率低、资质审核缺失、服务质量难保障等痛点&#xff0c;设计并开发基于SpringbootVue的校园家教信息平台&#xff0c;构建集家教信息发布、资质审核、供需匹配、服务跟踪于一体的数字化校园服务平台。系统以MySQL为数据存储…

基于C++的《Head First设计模式》笔记——模式合作

目录 一.专栏简介 二.模式合作 三.与鸭子重聚 1.创建一个Quackable接口 2.鸭子实现Quackable 3.模拟器 四.加上鹅 五.鹅适配器 六.模拟器中加入鹅 七.叫声的统计 八.模拟器加入装饰者 九.工厂生产鸭子 十.模拟器使用工厂 十一.创建一群鸭子 十二.修改模拟器 十三…

B4172 学习计划 题解

B4172 学习计划 题解 思路 可以将收益式子换一下,设 \(c_i\) 为 \(a_i\) 被分到的段的编号,那收益式子变成 \(\sum_{i=1}^n a_i \times b_{c_i}\)。 很显然的 dp, 设 \(f_{i,j}\) 为将 \(a\) 的前 \(i\) 个数分成 \(…

解码AI生态新范式,擘画智能未来新图景

2月23日&#xff0c;以“模塑全球 无限可能”为主题的2025全球开发者先锋大会在上海徐汇圆满落幕。这场汇聚全球智慧的行业盛会&#xff0c;以空前的行业影响力构建起覆盖产学研用全链条的生态体系&#xff0c;成为引领人工智能开源创新与垂类应用落地的风向标。瞬维智能CEO哲西…

基于Springboot+Vue的校园设备维护报修系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对校园内设备故障报修流程繁琐、响应滞后、维修进度难追踪、设备台账管理混乱等痛点&#xff0c;设计并开发基于SpringbootVue的校园设备维护报修系统&#xff0c;构建集报修提交、工单分配、维修跟踪、设备台账管理于一体的数字化校园服务平台。系统以MySQL为…