终于被论文题劝退之后来补这个坑了
引言
被HAOI2015按位或劝退
滚回去补vfk的论文
so happy
参见2015国家队论文《集合幂级数的性质与应用及其快速算法》
集合幂级数
引入
之前对于有关集合的计数问题 ,一般的常规思路是用 $f_S$ 去表示方案数然后去递推.
然而这个时候你看一眼题面 意识到自己 $O(4^n)$ 甚至连暴力都不如 (不对 这就是暴力)
于是我们需要一个东西来优化递推转移
还是用数列的理论来类比.之前多项式的一些理论是不是在集合中也可以使用呢?
我们曾经对于一个数列 $f0,f_1…$ 用一个生成函数来描述 即 $f(x) = \sum { k=0 } ^ { inf } f_k\times x^k$
左边是严格的数列递推 右边是优美的多项式 有成套的工具(板子)去解决.
但是集合的处理怎么办?
引入集合幂级数的概念
定义
令 $f$ 是定义域在集合 $U$ 以内,映射到 $F$ 的一个集合幂级数 , 对于每一个定义域中的 $S,S \in U$,设 $f_S$ 为该 $S$ 带入函数中所得到的值.
结论 确定了每一个 $S$ 所对应的 $f_S$ , $f$ 也可以随之确定且唯一.
我们用类似生成函数的定义方式的式子来定义 $f$ . $f = \sum _ { S \in U } f_S \times x ^ { S } $
这里的 $ f_S $ 并非系数 而是一个 $U$ 的子集所对应的一个点值.
我还是举论文上的例子吧。。。
$U={ 1,2 } , f(x) = 5x^{ \varnothing }$$+ 8x^ { { 1 } }$ $+$ $13x^ { { 1,2}}$
则这个集合幂级数里,$f({ 1,2 } ) = 13$,$f(\varnothing) = 5,f( { 1}) = 8$
考虑这个玩意的运算.
加减法显然系数相加相减即可.但是乘法呢?我们对于集合的运算取并取交 得到的似乎并不相同啊
引出子集变换集合卷积
FMT(Fast Mobius Transform)快速莫比乌斯变换
取集合运算 $L \subseteq U,R \subseteq U$,$L * R = L \cup R$
$f(x) = \sum { S \subseteq L} f_S x^S ,g(x) = \sum { S \subseteq R}g_S x^S$
它们的卷积为 $h(x) = \sum { L \subseteq U} \sum { R\subseteq U}f_Lg_R(L \cup R = S)$
Bruteforce
暴力枚举集合 复杂度 $O(3^N)$ 美滋滋
Divide & Conquer
考虑分治乘 对于现有的集合 $U = \ { 1,2,3,4,…n}$ 考虑 $ n $ 单独提出来 分类.
现在记号 $F_1(x)$ 表示现有的集合中不包含 $n$ 的 $F_2(x)$ 表示现有的集合中包含 $n$ 但是要除去的
$f * g = (F_1+ { x_nF_2})(G_1+x_nG_2)$
然后展开分治算就可以了.
$T(n) = T(n-1)+O(2^N)$ 由主定理 $T(n) = O(N\times2^N)$
据炸鸡小弟声称 分治乘往往跑的比$FMT$快 但也并不知道是为什么…
Fast Mobius Transform
证明看论文 这里只讲结论
定义一个幂级数的莫比乌斯变换为
$FS = \sum { T \subseteq S}f_T$
反过来 我们定义 $F$ 的莫比乌斯反演为 $f$
推个容斥错位相减 $fS = \sum { T \subseteq S} { (-1)^ { |S-T|}F_T}$
我们算卷积的时候 $h(x) = \sum { L \subseteq U} \sum { R\subseteq U}f_Lg_R(L \cup R = S)$
两边同时反演.最后可以得到 $H = F * G$ 即 反演后依然成立
最后两边反演即可 . 这样我们算发 $ f,g$ 的卷积 只要先莫比乌斯变换 然后相乘之后 再莫比乌斯反演 就可以啦
复杂度$O(N \times 2^N)$
模板 StupidOJ47
1 | //my vegetable has exploded. :( |
Fast Walsh-Hadamard Transform
本质上就是每一位只可能是 $1,0$ 的多项式
懒得证明正确性了 但是这是确实存在的
$FWT(A+B) = FWT(A) +FWT(B)$
$FWT(A \oplus B) = FWT(A) \times FWT(B)$
1 | void fwt_and(int *a,int type) { |