Multiplicity 题解

\(\texttt{Problem Link}\)

简要题意

给定一个序列 \(a\),求 \(\sum \limits _{i = 1} ^ n cnt_i\)

\(cnt_i\) 表示在 \(a\) 中选择长度为 \(i\) 的非空子序列 \(b\) 使得 \(\forall j \in [1, i], j | b_j\) 的数量。

思路

计数题,考虑 dp

\(f_{i,j}\) 表示前 \(i\) 个数,选到第 \(j\) 个数的方案数。

对于第 \(i\) 个数,有选和不选两种情况。

\(x,y\) 分别表示选和不选的方案数。

易得

\[x = f_{i - 1, t - 1} (t | a_i) \\ y = f_{i - 1, j} \\ f_{i , j} = x + y \]

然后再把第一维压掉就完了。

压掉之后要从后向前转移。

最后时间复杂度 \(\mathcal{O}(n \sqrt{\max(a_i)})\),空间复杂度 \(\mathcal{O}(n)\)

如果是把决策点排序就要再代一个 \(\log\sqrt{\max(a_i)}\)

\(Code1\)

\(Code2\)

posted @   Z_drj  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示