子集卷积 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}^n(F)\) 是指做一次 DMT 后每一项取 \(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。
冷静一下。$\ln(x{\varnothing}+x) $ 是什么?\(\varepsilon=x^{\varnothing}\),所以令 \(g=x^{a_i}\),就是 \(\ln(g+\varepsilon)\)。根据定义:
而 \((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 模板了。
注:上面的分析是基于 \(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)\)。

浙公网安备 33010602011771号