快乐的一天从AC开始 | 20210628 | ABC207E
考虑使用DP解决这题。
记\(dp_{i, j}\)表示将前\(i\)个元素分为\(j\)个连续子序列的方法数,记\(s_i = \sum_{j = 1}^{i} a_i\),那么有转移方程
\[dp_{i, j} = \sum_{k = 1}^{i} [s_i - s_k \equiv 0 \mod j] dp_{k, j - 1}
\]
很容易得出一个\(O(n^3)\)的DP方法,但是这个做法明显会超时。
注意到\(s_i - s_k \equiv 0 \mod j\)等价于\(s_i \equiv s_k \mod j\),所以转移方程可以写作
\[dp_{i, j} = mem_{j, s_i \% j}
\]
其中,\(mem_{i, j}\)表示满足\(s_k \equiv j \mod i\)的\(dp_{k, i - 1}\)之和。
这一步记录了额外信息,用空间换时间。
现在就可以\(O(n^2)\)做了。