学习笔记:集合幂级数与 FWT

集合幂级数

集合到整数

\(n\) 元集 \(A = a_1, a_2, \cdots, a_n\),定义 \(A\) 的幂集 \(2^{A} = \{S\mid S \subseteq A\}\) 到整数集 \(\mathbb{Z}\) 的映射 \(\text{id}\) 为:

\(S = \{a_{i_1}, a_{i_2}, \cdots, a_{i_k}\}\),则 \(\text{id}(S) = \sum_{j = 1}^{k}2^{i_j - 1}\),即状态压缩。

  • \(\text{id}\) 定义了 \(2^A\)\([0, 2^{n} - 1]\) 的一一映射。
  • \(\text{id}(S\cup T) = \text{id}(S) \text{ | } \text{id}(T)\)
  • \(\text{id}(S\cap T) = \text{id}(S) \text{ & } \text{id}(T)\)
  • \(\text{id}(S \triangle T) = \text{id}(S) \text{ ^ } \text{id}(T)\)。(\(S \triangle T = S\cup T - S\cap T\)

子集枚举:(枚举子集的子集)

for(int i = 0; i < 1 << n; ++ i) {
    for(int s = i; s; s = (s - 1) & i) {
        //
        if(s == 0) break;
    }
}

集合幂级数

给每个 \(S \in 2^A\) 赋予一个权值 \(w(S)\),则它关联的集合幂级数为 \(f(x) = \sum_{S\subseteq A} w(S)x^{\text{id}(S)}\)

与、或、异或卷积

对于集合幂级数 \(A, \ B\),他们的与卷积 \(C = A * B\),满足 \(c_k = \sum\limits_{i \&j = k}a_ib_j\),或和异或有类似定义。

与卷积中的单位元:\(e(x) = x^{2^n - 1}\),满足 \(\forall f(x) * e(x) = f(x)\)

性质:\(\sum_{S\subseteq T}w(T) = [x^{\text{id}(S)}]f(x) * (1 + x + \cdots+ x^{2^n - 1})\)。(超集和)

快速沃尔什变换

对于集合幂级数 \(A, B\),求他们的与卷积 \(C\)

思路:\(A, B \xrightarrow{\mathcal F} A', B' \rightarrow C'\xrightarrow{\mathcal F^{-1}} C\)。(\(\mathcal F\) 是某种变换)

posted @ 2024-05-22 17:54  Lu_xZ  阅读(2)  评论(0编辑  收藏  举报