哈集幂大学习

集合幂级数
对于序列 \(a_0\sim a_{2^n-1}\) ,定义多元多项式 \(A(x_1\sim x_n)=\sum_{0\le I\le 2^n} a_I x_1^{i_1}x_2^{i_2}\cdots x_n^{i_n}\) ,其中 \(i_1\sim i_n\) 是 \(I\) 的二进制表示。
然后你就可以发现,这个东西本质就是集合的生成函数。
简记序列 \(a\) 的集合幂级数为 \(A(x)=\sum a_I x^I\)。
进一步定义集合幂级数的乘法,也就是 \(A(x)\cdot B(x)\)。
在此之前,应该先定义单项式的乘法,也就是 \(x^I\cdot x^J\),在普通的生成函数里,乘法就是普通的乘法,所以 \(x^I\cdot x^J=x^{I+J}\),这也构成了乘法卷积是下标相加的形式。集合幂级数中的乘法一般为位运算,有以下几种形式:
- \(x^I\cdot x^J=x^{I\oplus J}\)
- \(x^I\cdot x^J=x^{I\cup J}\)
- \(x^I\cdot x^J=x^{I\cap J}\)
性质:
与生成函数有同样的性质,对于 \(a * b= c\),有 \(A(x)\cdot B(x)=C(x)\)。其中位运算相同,以下拿或举例:
占位集合幂级数
也就是在普通的集合幂级数上加入了集合大小,定义为 \(A[z](x)=\sum a_Ix^Iz^{|I|}\),可以发现普通的集合幂级数就是 \(A[1](x)\)。
子集卷积的集合幂级数做法
将 \(z\) 做元和参会有两种不同的做法,\(z\) 做元就是在FWT中讲到的子集卷积的做法,主要说说做参的做法。
\(A[z](x)=\sum (a_Iz^{|I|})x^I\) 其中 \(a_Iz^{|I|}\) 是第 \(I\) 项的系数,这是关于 \(z\) 的 \(n\) 次多项式,那么在\(DMT\) 和 \(IDMT\) 中的加减法变成了多项式的加减法,那么时间复杂度同样为 \(O(2^nn^2)\)。
然后你会集合幂级数就可以学习子集卷积全家桶了,先咕咕。

浙公网安备 33010602011771号