子集卷积 exp 和 ln

子集卷积 exp 和 ln。

【定义】

首先注意 \(\varepsilon=1\)

EXP:要求 \(f_0=0\),定义 \(\displaystyle\exp(f)=\sum_{n\ge 0}\frac{1}{n!}f^n\)。其中 \(f^n\) 表示 \(f\)\(n\) 次子集卷积。

LN:定义 \(\displaystyle\ln(g+\varepsilon)=\sum_{n\ge 1}\frac{(-1)^{n-1}}{n}g^n\)。注意不是 \((g+\varepsilon)^n\)

\(\exp(f)=g\iff \ln(g)=f\) 仍然成立)

【算法】

只能用占位幂级数了。

\(\exp(f)\)

用占位幂级数。

\(f\) 占位得到 \(F\),求 \(F\) 在或卷积意义下的 \(\exp\) 得到 \(G\),然后再占位还原。这里或卷积意义下的 \(\exp\) 就是 \(F^n\) 用或卷积乘。

问题在于怎么求 \(F\) 或卷积意义下的 \(\exp\)。即给定 \(F\),求 \(G=\sum_{n\ge 0}\dfrac{1}{n!}F^n\)

考虑 DMT。

\[\mathrm{DMT}(G)=\sum_{n\ge 0}\dfrac{1}{n!}\mathrm{DMT}(F^n)=\sum_{n\ge 0}\dfrac{1}{n!}\mathrm{DMT}^n(F) \]

这里 \(\mathrm{DMT}^n(F)\) 是指做一次 DMT 后每一项取 \(n\) 次方的结果。考虑每一项的结果。

\[\overline{G}_I=\sum_{n\ge 0}\dfrac{1}{n!}\overline{F}_I^n \]

注意到 \(F_I\) 里面是一个关于 \(z\) 的多项式,\(\overline{F},\overline{G}\) 也是。

我们发现这个形式又很熟悉:\(\overline{G}_I\) 这一项的多项式,就是 \(\overline{F}_I\)\(\exp\)!即 \(\overline{G}_I=\exp^{\overline{F}_I}\)

对每一项暴力 \(O(n^2)\)\(\exp\) 即可得到 \(\overline{G}\),再 iDMT 回去得到 \(G\)

因为 \(F\rightarrow\overline{F},\overline{G}\rightarrow G\) 是多项式的 DMT,已经 \(O(n^22^n)\) 的了。所以没必要 \(O(n\log n)\) 做 exp。


但是 \(O(n^2)\)\(\exp\) 是什么东西??

\(B(z)=e^{A(z)}\)\(A(z)=a_1z+\cdots+a_nz^n\),注意 \(A\) 无常数项。

欲求 $B(z)=1+b_1z+\cdots +b_nz^n+\cdots $.

两边求导得到:\(B'(z)=A'(z)\cdot e^{A(z)}\)

比较 \(z^{n-1}\) 系数,左边是 \(nb_n\),而右边 \([z^{i-1}]A'(z)=ia_i,[z^{n-i}]e^{A(z)}=[z^{n-i}]B(z)=b_{n-i}\)

所以 \(nb_n=\sum_{i=1}^{n}i\cdot a_i\cdot b_{n-i}\)。左边是 \(b_n\),右边是 \(b_{1\sim n-1}\),可以 \(O(n)\)\(b_n\)

一项 \(O(n)\),算所有 \(b_n\) 总共是 \(O(n^2)\) 的。

\(\ln(f)\)

\(g=\ln(f)=\sum_{n\ge 1}\dfrac{(-1)^{n-1}}{n}f^n\)

同样定义占位幂级数(子集卷积换成或卷积)\(G=\ln(F)\),求出 \(G\) 再还原成 \(g\) 即可。

问题在于 \(F\rightarrow \ln(F)\) 怎么做。

也是先做 DMT,然后在单点(每个单点是一个关于 \(z\) 的多项式)求 \(\ln\) 即可得到 \(\overline{G}\),然后再 iDMT。


同样,求 \(\ln\) 我们也 \(O(n^2)\) 的做。怎么做呢?

\(A(z)=1+a_1z+\cdots +a_nz^n,B(z)=\ln(A(z))=b_1z+\cdots +b_nz^n+\cdots\)

求导得到 \(B'(z)=\frac{A'(z)}{A(z)}\)。根据这个式子可以解出 \(B'\) 的系数,然后 \(O(n)\) 积分得到 \(b_n\)

\(f^n\)

\(f\) 的占位得到 \(F\),做 DMT 然后各项取 \(n\) 次方再做 iDMT 得到 \(G\),再占位还原即可。

【题目】

优秀子序列

给定 \(n\) 个集合 \(a_1\sim a_n\)。求 \(\prod_{i=1}^{n}(x^{\varnothing}+x^{a_i})\)。乘法为子集卷积。

\(n\le 10^6\),$|\cup a_i|\le 20。


\[\begin{aligned} \prod_{i=1}^{n}(x^{\varnothing}+x^{a_i})&=\exp(\ln(\prod_{i=1}^{n}(x^{\varnothing}+x^{a_i})))\\ &=\exp(\sum \ln(x^{\varnothing}+x^{a_i}))\\ \end{aligned} \]

冷静一下。$\ln(x{\varnothing}+x) $ 是什么?\(\varepsilon=x^{\varnothing}\),所以令 \(g=x^{a_i}\),就是 \(\ln(g+\varepsilon)\)。根据定义:

\[=\exp(\sum_i \sum_{k\ge 1}\dfrac{(-1)^{k-1}(x^{a_i})^k}{k})(这里k次方是子集卷积)\\ \]

\((x^{a_i})^k\)\(k\ge 2\) 时都是 \(0\)。因为当 \(k=2\)\((x^{a_i})^2=x^{a_i}\times x^{a_i}\)。无论怎么选,\(S\cap T\neq \varnothing\)。所以 \(k=2\) 时系数都是 \(0\),那么更大的次方系数也都是 \(0\)

所以有用的只有 \(k=1\)\(k=1\) 时就是 \(x^{a_i}\)

因此可以改写为:

\[=\exp(\sum_{i}x^{a_i}) \]

于是变成子集卷积 exp 模板了。

注:上面的分析是基于 \(a_i\neq 0\) 才能进行。原题存在 \(a_i=0\),需要特别处理。

对于 \(a_i=0\),每一个选或者不选对答案不造成影响。设 \(cnt0\)\(a_i=0\) 的个数,最终方案数要乘以 \(2^{cnt0}\)

LOJ154 集合划分

给定 \(S_0\sim S_{m-1}\)\(\{1\sim n\}\) 的子集。问 \(\{1\sim n\}\) 大小不超过 \(k\) 的划分个数。


容易写成集合幂级数的形式。定义 \(f(z)=\sum_{I}f_Ix^I\),其中 \(f_I=\sum [S_i=I]\)

即求 \([z^{2^n-1}]\sum_{i=0}^{k}\frac{f^i}{i!}\)。除以 \(i!\) 是因为划分的集合之间是无序的。

这很像 exp,区别在于 \(i\) 有了上界 \(k\)

问题转化为给定一个 \(p(z)\),求 \(\displaystyle\sum_{i=0}^{k}\frac{p^i(z)}{i!}\)。这其实很类似。


\(q(z)=\sum_{i=0}^{k}\frac{p^i(z)}{i!}\)。即求 \(q(z)\)

两边求导,\(q'(z)=p'(z)\sum_{i=1}^{k}\frac{p^{i-1}(z)}{(i-1)!}=p'(z)\sum_{i=0}^{k-1}\frac{p^i(z)}{i!}=p'(z)(q(z)-\frac{p^k(z)}{k!})\)

(注意分子是 \(p^i(z)\),是复合求导,不要忘了 \(p'(z)\)

所以 \(q'(z)=p'(z)(q(z)-\frac{p^k(z)}{k!})\)

类似地考虑 \(z^i\) 系数可以 \(O(n)\) 算出 \(q_{i+1}\)

一项 \(O(n)\),算完所有系数 \(O(n^2)\)。一共要在 \(O(2^n)\) 个位置算多项式,所以复杂度是 \(O(n^22^n)\)

posted @ 2025-11-15 23:13  FLY_lai  阅读(17)  评论(0)    收藏  举报