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