考虑使用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))做了。