[ABC221H] Count Multiset

给定 \(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)\)

posted @ 2024-11-14 22:27  2huk  阅读(1)  评论(0编辑  收藏  举报