F - Knapsack for All Subsets Editorial by TKTY1 Editorial for printing

$O(N+S\log S)$ 解法

 答えが \(\displaystyle[x^S]\prod_{i=1}^{N}(2+x^{A_i})\) となる所まではよいです.例えばこれは分割統治FFTで求めることができますが,さらなる高速化を考えます.多項式は次数 \(S+1\) 以上の項は無視して考えることとします.\(A\) 内の要素 \(a\) の出現回数を \(c_a\) と表すと,

\[\prod_{i=1}^{N}(2+x^{A_i})=2^{N}\prod_{i=1}^{N}\left(1+\frac{x^{A_i}}{2}\right)=2^N\prod_{i=1}^{S}\left(1+\frac{x^{i}}{2}\right)^{c_i}\]

となり,

\[\begin{aligned} \log\left(\prod_{i=1}^{S}\left(1+\frac{x^{i}}{2}\right)^{c_i}\right)&=\sum_{i=1}^{S}c_i\log\left(1+\frac{x^{i}}{2}\right)\\ &=\sum_{i=1}^{S}c_i\sum_{j=1}^{\left\lfloor S/i\right\rfloor}\dfrac{(-1)^{j-1}}{j\cdot2^j}x^{ij} \end{aligned}\]

と変形すると,この式は \(O(S\log S)\) で計算でき,この式を \(O(S\log S)\) で \(\exp\) することができるので,全体として \(O(N+S\log S)\) でこの問題を解くことができます.

posted:
last update: