线性基入门(?)
离线带删线性基
做法 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\),通过这里也能看出我们希望这个运算具有交换律和结合律。
推导
从特例入手:
- 若 \(S = \{u\}\),那么记 \(E_u = \{(u, v) \in E \mid v\in V\}\),所以一个点的邻边权值运算后需要为 \(0\)。
- 若 \(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\) 中任意基正交。
求解正交线性基
这里认为线性基的主元存的是最低位。
求解方法的想法太过神秘,也没有人提到任何思考过程,于是先跳过思考的这部分吧。
步骤如下:
- 对线性基做一个高斯消元,保证每个主元只会在这一行出现,在其他行都不会出现。
- 对于线性基为空的行,其对应主元为 \(i\),则把 \((i, i)\) 设为 \(1\) 后的第 \(i\) 列就是正交线性基的一组基。
一个例子:
至于正确性,我现在还不会说明为什么是线性无关的,,,
与 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\) 就有两种情况:
- \(a_i\) 能被 \(a_{1\sim i - 1}\) 线性表示。
- \(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\) 的位置。
所以有:
后面这个和式只能尝试转为生成函数推导:
\(F_i(x)\) 的求解似乎不能用分式分解(我尝试了,没化出来 qaq),考虑观察 \(x\),发现前面都带有 \(2^{j - 1}x\) 的系数,这启发对 \(x\) 前配凑系数:
那么可以知道:
于是对第二个式子两侧取 \([x^m]\) 可以得到:
通过边界情况 \([x^0]F_i(x) = 1\) 便可得到:
所以:
但是我们想要做到 \(\mathcal{O}(k)\),于是尝试找一些递推关系,可以发现:
递推要做到 \(\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})\)。

浙公网安备 33010602011771号