2021年10月3日日曜日

ABC 221 H - Count Multiset

分割数っぽい数え上げなので分割数っぽいDPを考える。

まずは分割数のDPを思い出す。自然数nnkk個の正整数の和に分割する場合の数をP(n,k)P(n, k)とする。分割の中に1を含まないものはnkn-kkk分割のすべての項を11増加させて得られ、分割の中に1を含むものはn1n-1k1k-1分割に1を付加すれば得られるのだった。漸化式で表すと

P(n,k)=P(nk,k)+P(n1,k1) P(n, k) = P(n-k, k) + P(n-1, k-1)

このDPを、同じ数をMM個より多くは含まないという制約(以下、単に制約と呼ぶ)に合うように修正することを考える。制約付きの分割の総数をP(n,k)P'(n, k)とする。

上の遷移の一つ目の項、つまり分割の中に1を含まないものをnkn-kkk分割のすべての項を11増加させて得る場合については、制約はそのまま守られるのでこのままでよさそう。一方、二つ目の項、つまり、分割の中に1を含むものを数えたい場合、このままだと1をM+1M+1個含むものも数えてしまうことになるので、これを除きたい。

nnkk分割で11をちょうどM+1M+1個含み、他は制約を満たしているようなものの総数 = n(M+1)n-(M+1)k(M+1)k-(M+1)分割で1を含まず、かつ制約を満たしているようなものの総数 = n(M+1)(k(M+1))n-(M+1)- (k-(M+1))、つまりnkn-kk(M+1)k-(M+1)分割で、制約を満たしているようなものの総数

と言い換えると、最後の量はP(nk,k(M+1))P'(n-k, k-(M+1))に等しいので、漸化式は

P(n,k)=P(nk,k)+P(n1,k1)P(nk,k(M+1)) P'(n, k) = P'(n-k, k) + P'(n-1, k-1) - P'(n-k, k-(M+1))

となる。


スターリング数っぽい数え上げがスターリング数っぽいDPでできる、はけっこう見るけど、分割数っぽい数え上げではうまくいく問題を見た記憶がなくて、遷移を考え始めるまでに時間がかかった……が、例えばJOI 2009 予選 F - ビンゴ がそうだったのを思い出した。