Multiplicity 题解
简要题意
给定一个序列 \(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)}\)。