【NOIP】【部分题解】
NOIP2021数列
Analysis
先注意题目的关键点:
- 要满足 的二进制表示中 的个数不超过
- 一个合法数列的权值是一个 的乘积形式
容易发现,限置和权值的计算都与位置无关,那么可以想到,先计算所有a序列单调不降的所有权值和再乘上个多重集排列数。
那么一个维度表示当前选的最高位是多少,一个维度表示目前选了几个数。我们还要在dp时满足S的限制,但是S的范围太大,不能直接表示。出题人不可能随便给个限制啊,这个限制一定是有一些性质的。
实际上,你会发现n的范围很小,所以S最多比当前选的最大的数的2的次幂要多4位,而且dp时按照从小到大递推,当前最大的数在二进制中对应的位置一旦确定,以后都不会改变,因此只需再用一个O(n)的维度表示前面确定的不会改变的1的个数,和2^4大小的维度表示剩下的S即可。
转移时用刷表法应该更方便,注意要边递推,边把多重集的排列数的贡献算上(一开始以为算不了,想别的方法想了好久。。。)
提交记录
补充:关于这题的dp,其实可以归为一类模型:
要给一个序列每个位置填上一个值,而且每个位置的限制相同,贡献也相同,那么可以考虑从小到大往里填值,如果允许某个数只选0个的话,那么就可以省去枚举上一大小的数是多少,转移时乘上二项式系数和累计的贡献
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具