线性基入门(?)

离线带删线性基

做法 1

一个方法是线段树分治拆分成 \(\mathcal{O}(\log q)\) 个元素,时间复杂度 \(\mathcal{O}(q\log q\log V)\)

这样非常无脑,但是没有用到任何线性基的性质,复杂度会相对较劣。

做法 2

想法来源:离线带删边连通性。
维护每条边被删除的时间,每个时刻动态维护 删除时间最靠后 的生成树。

类比上述方法,首先对每个元素求出删除时间,那么尝试维护一个保证主元删除时间最靠后的线性基。

对此考虑把 \(x\) 改为一个二元组 \((x, t)\) 代表对应的元素和删除时间。
依然类似的找到 \(x\) 的最高位 \(i\),查看 \(i\) 对应的主元 \((x', t')\),如果没有就直接插入,否则根据 \(t, t'\) 大小关系保留更大的,即若 \(t > t'\) 则把主元改为 \((x, t)\),当前元素变为 \((x', t')\),最后 \(x\gets x\oplus x'\) 继续往瞎做。

在时刻 \(t_q\) 查询时,就只需在意 \(t\ge t_q\)\((x, t)\),其余内容与线性基相同。

此时复杂度为 \(\mathcal{O}(q\log V)\)

这个思想其实是维护一个持续性,让当前的状态可以“活更久”。

BZOJ 4184 shallot

这个是板子题。

刻画无向图割集

定义

把无向图 \(G = (V, E)\) 分为 \(S, V - S\) 两个集合,\(E' = \{(u, v)\in E\mid u\in S, v\in V - S\}\) 称为图 \(G\) 的一组割集。

初步想法

考虑为每个边赋一种非平凡权值 \(w_{(u, v)}\),并定义一种运算 \(\oplus\),若边集 \(E'\) 是割集,当且仅当 \(\bigoplus\limits_{(u, v)\in E'} w_{u, v} = 0\),通过这里也能看出我们希望这个运算具有交换律和结合律。

推导

从特例入手:

  1. \(S = \{u\}\),那么记 \(E_u = \{(u, v) \in E \mid v\in V\}\),所以一个点的邻边权值运算后需要为 \(0\)
  2. \(S = \{u, v\}\),若 \((u, v)\not\in E\),则 \(E = E_u\cup E_v\),于是需要有 \(0\oplus 0 = 0\),若 \((u, v)\in E\),则 \(E\) 可以视为 \((E_u - (u, v)) \cup (E_v - (u, v))\),也就可以看作 \((0 \oplus_- w_{(u, v)})\oplus (0\oplus_- w_{(u, v)}) = 0\)\(\oplus_-\)\(\oplus\) 的逆运算)。

如果尝试简单化即令 \(\oplus_- = \oplus\),那么这相当于 \(x\oplus x = 0\),会很惊喜的发现这个运算能对应上异或。
并且发现这样只要对于 \(E_u\) 合法,所有合法的 \(E'\) 都合法,因为这都可以看作依次往 \(S\) 里加点,\(S\) 内的边会被抵消,只留下 \(S\)\(V - S\) 的边,并且异或后为 \(0\)

接下来就考虑构造权值了。

一个能够保证稳定正确性的方法是,考虑把每条边视为 \(\mathbb{Z}_2^m\) 的向量。
对于求解向量,一个方法是根据每个点的情况设计出 \(n\) 个等式,然后高消得到一些等价关系对应设计。
不过我们有着更好的想法,考虑建一颗 dfs 树,对于非树边设计出 \((1, 0, 0, \cdots), (0, 1, 0, \cdots)\) 的权值,对于树边,可以通过递推的想法,得到连向的儿子当前邻边异或向量,为了使其为 \(0\),该边向量设计为相同的值即可。

一些问题

对于 \(m\) 远大于 \(n\) 的情况(实际上需要的维数是非树边数),维数过多时间复杂度甚至不如直接判定。

对此,一个想法是把确定的向量改成随机赋权,即为每个非树边赋一个 \([0, 2^B)\) 内的权值,树边也对应递推。

这样的好处是当 \(B\le 64\) 时可以直接用 ull 维护(\(128\) 也可以用 u128)。

不过这样对于正确性就会存在些许问题,对于判定可能会把非割集判定成割集,这个的概率应当是 \(\frac{1}{2^B}\) 的(分析最后一个元素,随机情况下有 \(2^B\) 种取值,只有 \(1\) 个取值可以使 \(\oplus = 0\))。

Luogu P10778 BZOJ3569 DZY Loves Chinese II

这个题需要做一个缩小范围的过程,具体来说,会发现若不连通,则一定可以找到一个连通块,令其为 \(S\),其余部分为 \(V - S\),这样就转为了割集判定。

于是判定就变成了,判定是否存在一个子集 \(\oplus = 0\),线性基判断即可。

时间复杂度即为 \(\mathcal{O}(n + m + (q + \sum k)B)\)

对于正确性,相当于是询问 \(k\)\([0, 2^B)\) 的随机变量线性基满秩的概率,为 \(\prod\limits_{i = 1}^k (1 - \frac{2^{i - 1}}{2^B})\),该题 \(k\le 15\),所以取 \(B = 64\) 错误概率极小。

正交线性基

定义

\(a, b\) 都为 \(\mathbb{Z}_2^n\) 的向量。

定义加法 \(a + b = c\) 满足 \(\forall i\in [1, n]\)\(c_i = (a_i + b_i)\bmod 2 = a_i\oplus b_i\)
定义内积 \(a \cdot b = c\) 满足 \(c = (\sum\limits_{i = 1}^n a_ib_i)\mod 2\)

于是根据乘法分配律可以知道 \((a + b)\cdot c = a\cdot c + b\cdot c\)

\(A\) 表示线性基,\(\operatorname{span}(A)\) 表示 \(A\) 构成的线性空间。

对于 \(\mathbb{Z}_n^2\) 下秩为 \(k\) 的线性基 \(A\),其正交线性基 \(A^\perp\) 满足 \(\operatorname{span}(A^\perp)\)\(\operatorname{span}(A)\) 的正交补空间,也即 \(A^\perp\) 的秩为 \(n - k\)\(A^\perp\) 中的任意基与 \(A\) 中任意基正交。

求解正交线性基

这里认为线性基的主元存的是最低位。

求解方法的想法太过神秘,也没有人提到任何思考过程,于是先跳过思考的这部分吧。

步骤如下:

  1. 对线性基做一个高斯消元,保证每个主元只会在这一行出现,在其他行都不会出现。
  2. 对于线性基为空的行,其对应主元为 \(i\),则把 \((i, i)\) 设为 \(1\) 后的第 \(i\) 列就是正交线性基的一组基。

一个例子:

\[\begin{align*} \begin{bmatrix} 1\ &1\ &0\ &1\ &0\\ 0\ &1\ &1\ &0\ &0\\ 0\ &0\ &0\ &1\ &1\\ \end{bmatrix} &\Longrightarrow \begin{bmatrix} \color{red}1\ &\color{red}1\ &\color{red}0\ &\color{red}1\ &\color{red}0\\ \color{blue}0\ &\color{blue}1\ &\color{blue}1\ &\color{blue}0\ &\color{blue}0\\ 0\ &0\ &0\ &0\ &0\\ \color{green}0\ &\color{green}0\ &\color{green}0\ &\color{green}1\ &\color{green}1\\ 0\ &0\ &0\ &0\ &0\\ \end{bmatrix} \\ &\Longrightarrow \begin{bmatrix} 1\ &0\ &1\ &0\ &1\\ 0\ &1\ &1\ &0\ &0\\ 0\ &0\ &\color{red}0\ &0\ &0\\ 0\ &0\ &0\ &1\ &1\\ 0\ &0\ &0\ &0\ &\color{blue}0\\ \end{bmatrix} \\ &\Longrightarrow \begin{bmatrix} 1\ &0\ &\color{red}1\ &0\ &\color{blue}1\\ 0\ &1\ &\color{red}1\ &0\ &\color{blue}0\\ 0\ &0\ &\color{red}1\ &0\ &\color{blue}0\\ 0\ &0\ &\color{red}0\ &1\ &\color{blue}1\\ 0\ &0\ &\color{red}0\ &0\ &\color{blue}1\\ \end{bmatrix} \\ &\Longrightarrow \begin{bmatrix} 1\ &1\ &1\ &0\ &0\\ 1\ &0\ &0\ &1\ &1\\ \end{bmatrix} \end{align*} \]

至于正确性,我现在还不会说明为什么是线性无关的,,,

与 FWT 的关系

首先要知道 FWT 后 \(x^u\)\(x^v\) 的系数为 \((-1)^{u\cdot v}\)

于是考虑对于一个线性基 \(A\) 所组成的集合幂级数 \(F(x)\),即 \([x^s] F(x) = [s\in \operatorname{span}(A)]\),那么 FWT 后得到的 \(\hat{F}(x)\) 会是什么样子呢?

首先因为封闭性 \(F(x)\times F(x) = F(x)\cdot 2^k\)(第一个是 XOR 卷积,第二个是点乘),于是 FWT 后有 \(\hat{F}(x)\times \hat{F}(x) = \hat{F}(x)\times 2^k\)(第一个是对位相乘,第二个是点乘)。
于是可以知道 \([x^s]\hat{F}(x)\) 只可能是 \(0\)\(2^k\)

那么根据正交的定义,只有在正交线性基所成的线性空间中的元素会与线性基中的基正交,也就会与线性基中的每个元素正交,也就会有 \(2^k\) 的权值。
于是 \([x^s]\hat{F}(x) = 2^k[x\in \operatorname{span}(A^\perp)]\)

这给出了一个很好的对立的视角,因为线性基和正交线性基的秩总和为维数,就可以套用上阈值分治的想法。

CF 1336E2 Chiori and Doll Picking (hard version)

待补。

线性基求交

正交同时也给出了一个类似补集的性质。

具体来说,对于两个线性基 \(A, B\),有 \(A\cap B = (A^\perp + B^\perp)^\perp\)(\(+\) 表示线性基的合并),看着就像是对于两个集合 \(S, T\),有 \(S\cap T = \complement_U(\complement_U S \cup \complement_U T)\)

证明考虑先把 \(A, B\) 换成 \(A^\perp, B^\perp\) 的形式,即证 \(A^\perp\cap B^\perp = (A + B)^\perp\),这可以都看作是 \(A, B\) 对应线性空间的集合幂级数 \(F_A(x), F_B(x)\)

\(F_A(x)\times F_B(x) = F_C(x)\)\(C\) 也就是 \(A, B\) 的并。
对于左侧,这相当于是求出了 \(\hat{F_A}(x), \hat{F_B}(x)\),再点乘得到了 \(\hat{F_C}(x)\)
对于右侧,\(A + B\) 相当于是求出了 \(C\),再求正交相当于是求出了 \(\hat{F_C}(x)\),也是相等的。

CF 1603F October 18, 2017

为什么会是 *2700???

首先考虑一下 \(x\) 的作用是什么,感受一下,会感觉 \(0\) 或许会比较特殊(如果做点线性基的题能感受到)。

首先考虑 \(x = 0\),这就相当于要求 \(n\)\([0, 2^k)\) 元素满秩的方案数,考虑类似线性基,依次加入元素,那么加入第 \(i\) 个元素时就不能被前 \(i - 1\) 个元素线性表示,所以方案数是 \(\prod\limits_{i = 1}^n (2^k - 2^{i - 1})\)
因为 \(n\le k\) 时才可能放不出 \(0\),所以 \(n > k\) 时答案为 \(0\)\(n\le k\)\(\mathcal{O}(k)\) 计算。

接下来考虑 \(x\not = 0\) 的情况,会发现 \(x\not = 0\) 的答案是相同的(我并不知道怎么解释,但是从后面的做法中可以看出来这一点)。

对于不能凑出 \(x\),一个想法是放入 \(x\) 变为不能凑出 \(0\)

于是对于 \(a_i\),根据 \(a_{1\sim i - 1}\)\(x\) 就有两种情况:

  1. \(a_i\) 能被 \(a_{1\sim i - 1}\) 线性表示。
  2. \(a_i\) 不能被 \(x\)\(a_{1\sim i - 1}\) 线性表示。
    (其实就是 \(a_i\) 不能被 \(x\)\(a_{1\sim i - 1}\) 的部分线性表示的转义。)

于是可以尝试 dp,记 \(f_{i, j}\) 为放入了 \(a_{1\sim i}\),秩为 \(j\) 的方案数。
转移根据上文可以得到 \(f_{i, j} = f_{i - 1, j}\times 2^{j - 1} + f_{i - 1, j - 1}\times (2^k - 2^{j - 1})\)
初值即为 \(f_{0, 1} = 1\),最终答案为 \(\sum_{i = 0}^k f_{n, i}\)

因为答案所要求的第一维都是 \(n\),尝试枚举第二维然后代数推导,即考虑代数推导 \(f_{n, i}\) 的值。

考虑转移的第二部分,即第二维 \(+1\) 时乘上的值都是 \((2^k - 2_{j - 1})\),那么 \(f_{n, i}\) 就至少有一个 \(\prod\limits_{j = 2}^i (2^k - 2^{j - 1})\) 的公因式,就只需要考虑第一部分的贡献和两部分拼起来的贡献了。

此时考虑直接枚举每个 \(j\) 乘了多少个 \(2^{j - 1}\),会发现这恰好也数出了组合的方案数,因为整个过程是有序的,所以可以直接通过乘了多少个 \(2^{j - 1}\) 推出每次 \(j\gets j + 1\) 的位置。

所以有:

\[\begin{align*} f_{n, i} = \prod\limits_{j = 2}^i (2^k - 2^{j - 1}) \sum\limits_{x_1 + x_2 + \cdots + x_i = n - i + 1} \prod\limits_{t = 1}^i 2^{x_t(t - 1)} \end{align*} \]

后面这个和式只能尝试转为生成函数推导:

\[\begin{align*} F_i(x) &= \prod\limits_{j = 1}^i \frac{1}{1 - 2^{j - 1}x}\\ f_{n, i} &= \prod\limits_{j = 2}^i (2^k - 2^{j - 1}) [x^{n - i + 1}]F_i(x) \end{align*} \]

\(F_i(x)\) 的求解似乎不能用分式分解(我尝试了,没化出来 qaq),考虑观察 \(x\),发现前面都带有 \(2^{j - 1}x\) 的系数,这启发对 \(x\) 前配凑系数:

\[\begin{align*} G_i(x) = F_i(2x) = \prod\limits_{j = 1}^i \frac{1}{1 - 2^j x} \end{align*} \]

那么可以知道:

\[\begin{align*} [x^m]G_i(x) &= 2^m[x^m]F_i(x)\\ G_i(x)(1 - 2^i x) &= F_i(x)(1 - x) \end{align*} \]

于是对第二个式子两侧取 \([x^m]\) 可以得到:

\[\begin{align*} [x^m]G_i(x) - 2^i[x^{m - 1}]G_i(x) &= [x^m]F_i(x) - [x^{m - 1}]F_i(x)\\ 2^m[x^m]F_i(x) - 2^{i + m - 1}[x^{m - 1}]F_i(x) &= [x^m] F_i(x) - [x^{m - 1}]F_i(x)\\ (2^m - 1)[x^m]F_i(x) &= (2^{i + m - 1} - 1)[x^{m - 1}]F_i(x)\\ [x^m]F_i(x) &= \frac{2^{i + m - 1} - 1}{2^m - 1}[x^{m - 1}]F_i(x) \end{align*} \]

通过边界情况 \([x^0]F_i(x) = 1\) 便可得到:

\[\begin{align*} [x^m]F_i(x) = \prod\limits_{j = 1}^m \frac{2^{i + j - 1} - 1}{2^j - 1} \end{align*} \]

所以:

\[\begin{align*} f_{n, i} &= \prod\limits_{j = 2}^i (2^k - 2^{j - 1}) \prod\limits_{j = 1}^{n - i + 1}\frac{2^{i + j - 1} - 1}{2^j - 1} \end{align*} \]

但是我们想要做到 \(\mathcal{O}(k)\),于是尝试找一些递推关系,可以发现:

\[\begin{align*} f_{n, 1} &= 1\times 1 = 1\\ f_{n, i} &= f_{n, i - 1}\times (2^k - 2^{i - 1})\times \frac{2^{n - i + 2} - 1}{2^i - 1} \end{align*} \]

递推要做到 \(\mathcal{O}(1)\),就需要先 \(\mathcal{O}(\log \operatorname{mod})\) 得到 \(2^{n + 0\sim 1}\)(看实现),每次乘 \(\frac{1}{2}\),分母逆元我用的是 \(\mathcal{O}(n + \log \operatorname{mod})\) 处理任意序列 \(a_{1\sim n}\) 的逆元的方法。

最后总时间复杂度为 \(\mathcal{O}(\sum k + T\log \operatorname{mod})\)

posted @ 2026-01-14 15:19  rizynvu  阅读(20)  评论(0)    收藏  举报