# ABC221 H - Count Multiset ## 問題リンク - https://atcoder.jp/contests/abc221/tasks/abc221_h ## 解法 形式的べき級数による解法をとります。 まず, 元の問題を以下のように解釈します. > $M$ 以下の非負整数からなる数列 $x$ であって $\sum_{n=1}^{\infty}{nx_n}$ を満たすようなものはいくつあるか? $x$の指数に選んだ要素の和を, $y$ の指数に要素の個数を乗せることで求めるべきは以下で表される $(k=1,2,\cdots,N)$ $$[x^Ny^k]\prod_{i=1}^{\infty}{\sum_{0\leq j\leq M}{x^{ij}y^j}}$$ Σ部分をきれいにして $$[x^Ny^k]\prod_{i=1}^{\infty}{\frac{1-(x^iy)^{M+1}}{1-x^iy}}$$ となる. ここで, 分母の形に[見覚えがある](https://maspypy.com/%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%83%BB%E5%BD%A2%E5%BC%8F%E7%9A%84%E3%81%B9%E3%81%8D%E7%B4%9A%E6%95%B0-%E9%AB%98%E9%80%9F%E3%81%AB%E8%A8%88%E7%AE%97%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%82%E3%81%AE#toc21)ということで同様のアプローチをしてみる. $$f(x,y)=\frac{1-(xy)^{M+1}}{1-xy}$$ $$F(x,y)=\prod_{i=1}^{\infty}{f(x^i,y)}$$ とする. ここで, 任意の $n$ に対して以下が成り立つ $$f(x^n,xy)=f(x^{n+1},y)$$ したがって, 以下のように変形していくことができる. $$ \begin{aligned} f(x,y)F(x,xy)&=f(x,y)\prod_{i=1}^{\infty}{f(x^i,xy)}\\&=f(x,y)\prod_{i=1}^{\infty}{f(x^{i+1},y)}\\&=\prod_{i=1}^{\infty}{f(x^{i},y)}\\&=F(x,y) \end{aligned} $$ すなわち $$\left(1-(xy)^M\right)F(x,xy)=(1-xy)F(x,y)$$ が成り立つ. $F(x,y)$ の $x^iy^j$ の係数を $a_{i,j}$とする. この時, 左辺は以下のようになる. $$ \begin{aligned} \left(1-(xy)^M\right)F(x,xy) &=\left(1-(xy)^M\right)\sum_{i=0}^{\infty}\sum_{j=0}^{\infty}{a_{ij}x^{i+j}y^j}\\ &=\sum_{i=0}^{\infty}\sum_{j=0}^{\infty}{(a_{i-j,j}-a_{i-j,j-M})x^iy^j} \end{aligned} $$ 一行目の式変形に $F(x,y)$ が $xy$ を用いて表示できることを利用した. また, 右辺も同様にやると以下のようになる $$ \begin{aligned} (1-xy)F(x,y)&=(1-xy)\sum_{i=0}^{\infty}\sum_{j=0}^{\infty}{a_{ij}x^iy^j}\\ &=\sum_{i=0}^{\infty}\sum_{j=0}^{\infty}{(a_{i,j}-a_{i-1,j-1})x^iy^j} \end{aligned} $$ 係数比較をすると以下が得られる $$a_{i-j,j}-a_{i-j,j-M}=a_{i,j}-a_{i-1,j-1}$$ 移項して $$a_{i,j}=a_{i-j,j}-a_{i-j,j-M}+a_{i-1,j-1}$$ よって $O(N^2)$ のDPで $a$ を埋めることができる. 以上よりこの問題が解けた.