题目大意
给定整数集合 , 计算有多少个子集 , 使得 都可以被表示为 的一个子集中所有数的和. , 答案对 取模.
解法概要
设 计数和为 , 且可以表达出 的集合数量. 由于每个集合存在最小的不可表示之数, 得到生成函数方程
而答案就是 .
若进行倍增转化只需解决给定一组 , 计算
的问题.
注意到 , 原恒等式的 LHS 可以展开成
因此我们有
右式可以 从大到小合并, 复杂度为 .
若干注记
Remark 1 有人认为 集合里只用考虑加入了 个数 是本题的一个关键的切入点, 但这个性质是不重要的. 我们知道, 整数拆分有 Durfee Square 分解, 适当调整题意将问题改成类似的拆分问题 (例如每个数可以出现任意多次) 仍然可以有类似的 算法, 从整数拆分的 DP 的角度也有此结论.
Remark 2 如许使用 FFT, 我们能做得更好: 我们将 的前 项和后面的项分开处置, 前面的项可以写作
通过分治 FFT 可以在 时间内计算.
后面的项按照原来的方法处理, 复杂度是 .
平衡复杂度为 .
Question 1: 是否存在 上指数更低的算法? 不过相关问题的思考表明, 可能也是一个相当典型的构造. 此外, 也有一些更奇怪的问题可以做到 , 不太确定其思想能否派上用场.
Remark 3 本题的另一个扩展方向是变成输入的整数拆分, 比如将一开始的整数集合 从给定的一个很规则的集合改为输入. 但这一方面当时似乎只得到了类似 的平凡结果, 实现也颇为笨重, 故没有进一步探索.
多余的话
标题来自小时候听到的一首三体同人曲《冥王星的雪》:
说什么山河重整 桃源里偷度余生
梦难承 几擦肩几度重逢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具