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 @ 2024-04-18 16:25  Z_drj  阅读(19)  评论(0编辑  收藏  举报