给定 \(n, m\)。对于每个 \(k = 1,2,\dots,n\),求解有多少大小为 \(k\) 的正整数可重集的元素和为 \(k\),且每个元素的出现次数都 \(\le m\)。
\(m \le n \le 5000\)。
可重集转化成单调不降的序列 \(a\)。在通过差分转化成任意非负整数序列 \(b\)(需要保证 \(b_1 > 0\))。
可重集中所有元素的出现次数都 \(\le m\),等价于 \(a\) 中极长连续段的长度 \(\le m\),等价于 \(b\) 中不存在连续 \(m-1\) 个 \(0\)。
考虑如何通过 \(b\) 反推 \(\sum a_i\)。不难发现每个 \(b_i\) 都被贡献了 \(n - i + 1\) 次。于是:
\[\sum a_i = \sum b_i \times (n-i+1) \]考虑对 \(b\) DP。设 \(f(i, j)\) 表示考虑 \(b_1 \dots b_i\) 且目前 \(b\) 中的和为 \(j\) 的方案数。转移枚举 \(b_i\) 以及 \(1 \sim i-1\) 中最后一个 \(0\) 的位置。前者调和级数,后者可以前缀和优化。总复杂度 \(\mathcal O(n^2 \log n)\)。
标签:Count,dots,le,sum,ABC221H,Multiset From: https://www.cnblogs.com/2huk/p/18546968