线性代数
线性代数
1. 基本概念
设向量组 \(S=\{\vec{a_1},\vec{a_2},\vec{a_3},...,\vec{a_n}\}\)。
- 若向量 \(\vec{b}\) 存在一组 \(c_i\) 满足 \(\vec{b}=\sum_{i=1}^n c_i{\vec{a_i}}\),则称 \(\vec{b}\) 为 \(S\) 的一个 线性组合。
- 所有线性组合的集合称为 张成空间 或 线性空间,记为 \({\rm span}(S)\)。
- 设 \(T\subseteq S\),若 \({\rm span}(T)={\rm span}(S)\),则 \(T\) 为该空间的一个 张成集。
- 所有真子集都不是张成集的张成集为 基底,简称 基。
- 设 \(S\) 为基,\(\vec{b}=\sum_{i=1}^n c_i{\vec{a_i}}\),则称 \(\vec{b}\) 在 \(S\) 下的 坐标 为 \((c_1,c_2,c_3,\cdots,c_n)\)。
- 若 \(\vec{a}\cdot \vec{b}=0\),那么称这两个向量 垂直 或 正交。
2. 线性空间
2.1 线性相关与线性无关
若 \(S\) 中 存在 \(i\) 和一组 \(c_j\) 满足 \(\vec{a_i}=\sum_{j\ne i}c_j\vec{a_j}\),则称 \(S\) 线性相关,否则 \(S\) 线性无关。
\(S\) 线性无关,等价于:
-
\(\sum x_i \vec{a_i}=\vec{0}\) 只有一个解 \(x_i=0\)。
若 \(S\) 线性相关,则 \(\vec{a_i}=\sum_{j\ne i}c_j\vec{a_j}\),移项得 \(-\vec{a_i}+\sum_{j\ne i}c_j\vec{a_j}=\vec{0}\)。于是若只有平凡解,\(S\) 线性无关。
若有平凡解以外的解,设 \(c_k\ne 0\),那么 \(\sum_{j\ne k}c_j\vec{a_j}=-c_k\vec{a_k}\),把 \(-c_k\) 移过去,得出 \(S\) 线性相关。则若线性无关,只有平凡解。
-
\(\forall \vec{b}\in {\rm span}(S)\),只存在一组 \(c_i\),满足 \(\sum c_i\vec{a_i}=\vec{b}\)。
设有多于一组解,\(\vec{b}=\sum c_i\vec{a_i}=\sum d_i\vec{a_i}\),移项 \(\sum (c_i-d_i)\vec{a_i}=\vec{0}\),得出线性相关。
若 \(S\) 线性相关,则 \(\vec{b}=\sum c_i\vec{a_i}=\sum_{j\ne i}c_j\vec{a_j}+\sum_{j\ne i} d_j\vec{a_j}\),有两组解。
2.2 线性空间的基底
Lemma: 对于任意一个线性无关子集 \(S\) 与任意一个生成集 \(T\),满足 \(|S|\le |T|\)。
重复以下过程:将 \(\vec{s_i}\) 加入到 \(T\) 的最前面,然后找到 \(T\) 中第一个与前面线性相关的 \(\vec{t_i}\),删除它。
\(S\) 中的元素一定能全部加入;否则由于 \(T\) 始终是生成集,\(S\) 的一个子集可以张成其他向量,与线性无关矛盾。
而基是线性无关的生成集,所以 \(|S|_{\max}=|B|=|T|_{\min}\)。这个大小为空间 \(V\) 的 维度,记为 \(\dim V\)。
得出基的其他等价定义:
- \(|B|=\dim V\) 且线性无关;
- \(|B|=\dim V\) 且是张成集;
- \(B\) 是极大线性无关子集;
- \(B\) 是极小生成集;
- \(B\) 是线性无关生成集。
求基可以用高斯(约旦)消元法求解。这里不再赘述。
2.3 线性空间与欧氏空间
考虑如何为一维、二维、三维空间分别构造一个向量集合,使得这个集合是空间内所有向量的基底。
对每个空间坐标轴取一个单位向量,这些单位向量就是线性空间的一组基。二维的单位向量记为 \(\vec{i},\vec{j}\),三维的记为 \(\vec{i},\vec{j},\vec{k}\)。
像这样,若基 \(\{\vec{e_1},\vec{e_2},\cdots,\vec{e_n}\}\) 满足 \(\vec{e_i}\) 的第 \(i\) 个分量为 \(1\),其余分量为 \(0\),则称其为 标准基。
考虑三维欧氏空间:在线性空间中线性相关的 \(3\) 个向量,等价于在三维空间中共面或共线。同理,线性无关的 \(3\) 个向量等价于在三维空间中不共面或共线。
推广到 \(k\) 维线性空间,\(k\) 个线性空间中 \(k\) 个线性相关的向量,等价于它们同时处于一个小于 \(k\) 维的空间中。
另外,我们有:
- \(n\) 维空间内 \(n\) 个线性无关的向量构成线性空间的一组基;
- \(n\) 维空间的线性空间的基大小为 \(n\)。
2.4 单位正交基
在三维空间中,对于一个向量 \(\vec{v}=(x,y,z)\),有 \(x=\vec{v}\cdot \vec{i},y=\vec{v}\cdot \vec{j},z=\vec{v}\cdot \vec{k}\)。
类似地,在线性空间中,若对于线性空间中任意的向量 \(\vec{v}=\sum c_i\vec{a_i}\) 满足 \(c_j=\vec{a_j}\cdot \vec{v}\),则称这个基为 单位正交基,也称 标准正交基。
定理:基 \(S=\{\vec{v_1},\vec{v_2},\vec{v_3},\cdots,\vec{v_n}\}\) 为单位正交基的充要条件是 \(\vec{v_i}\cdot \vec{v_j}=[i=j]\)。
证明:
- 充分性:设 \(\vec{v}=\sum {c_i\vec{v_i}}\),两边同时点乘 \(v_j\) 得 \(\vec{v}\cdot \vec{v_j}=\sum c_i \vec{v_i}\cdot \vec{v_j}=\sum c_i [i=j]=c_j\)。
- 必要性:令 \(\vec{v}=\vec{v_j}\),则 \(c_i=[i=j]\)。得 \(c_i=\vec{v_i}\cdot \vec{v}=\vec{v_i}\cdot \vec{v_j}=[i=j]\)。
于是所有的 \(\vec{v_i}\) 两两正交且模长均为 \(1\)。
单位正交基不唯一。在 \(\mathbb{R}^2\) 中,单位正交基可以为 \(\vec{v_1}=(\cos \theta,\sin \theta),\vec{v_2}=(-\sin \theta,\cos \theta)\),\(\theta\) 可取任意实数。
性质:在单位正交基下,设 \(\vec{a}=\sum c_i\vec{v_i},\vec{b}=\sum d_i\vec{v_i}\),则 \(\vec{a}\cdot \vec{b}=\sum c_id_i\)。
即,两向量的内积等于其在单位正交基下对应位坐标相乘再求和。
证明:
\[\vec{a}\cdot \vec{b}=(\sum c_i\vec{e_i})\cdot (\sum d_i\vec{e_i})=\sum_i\sum_j c_id_j\vec{e_i}\cdot\vec{e_j}=\sum c_id_i \]
同理,若 \(\vec{a}\cdot \vec{b}=\sum c_id_i\),则该基是单位正交基。
更严谨的条件应改为 \(\vec{a}\cdot \vec{b}=\sum c_i\overline{d_i}\),详见第 3 节。
3. 广义的线性空间
设标量数域 \(F\) 和非空向量集合 \(V\),\(V\) 上定义了向量加法 \(+\) 和标量乘法 \(\times\),若满足下列性质,则称 \(V\) 是 \(F\) 上的 线性空间,记为 \(V(F)\) 或 \(V\):
- \((V,+)\) 构成阿贝尔群,即有封闭性、有结合律与交换律、有逆元和单位元;
- 标量乘法有封闭性、有交换律、有结合律、有分配律、有单位元。
\(V(F)\) 可以是相当抽象的东西,比如可以让 \(F=\mathbb{R}\),\(V\) 是所有定义域为 \(\mathbb{R}\) 的实数函数的集合。
称 \(\mathbb{R}^n(\mathbb{R})\) 为 实线性空间,\(\mathbb{C}^n(\mathbb{C})\) 为 复线性空间。
广义线性空间中也有基:设当前基为 \(S\),每次加入一个 \(V\setminus {\rm span}(S)\) 内的向量,直到 \({\rm span}(S)=V\)。若该线性空间的维度有限,则一定可以在有限步数内停止。
若该线性空间上还定义了内积,那么称 \(V(F)\) 为一个 内积空间。
内积需要满足:
- 正定性:\(\vec{a}\cdot \vec{a}\ge 0\),\(\vec{a}\cdot \vec{a}=0\) 当且仅当 \(\vec{a}=\vec{0}\),\(\vec{0}\) 表示 \(V\) 上的加法单位元;
- 共轭对称性:\(\vec{a}\cdot \vec{b}=\overline{\vec{b}\cdot \vec{a}}\),\(\overline{x}\) 表示复共轭;
- 半双线性性:\((\lambda(\vec{a}+\vec{b}))\cdot \vec{c}=\lambda(\vec{a}\cdot\vec{c})+\lambda(\vec{b}\cdot\vec{c})\),\(\vec{a}\cdot(\lambda(\vec{b}+\vec{c}))=\overline{\lambda}(\vec{a}\cdot\vec{b})+\overline{\lambda}(\vec{a}\cdot\vec{c})\)。
如果该空间是实内积空间,那么共轭对称性退化为对称性,半双线性性退化为双线性性。
例如,\(\mathbb{R}^n(\mathbb{R})\) 上的标准内积定义为 \(\vec{a}\cdot \vec{b}=\sum a_ib_i\),\(\mathbb{C}^n(\mathbb{C})\) 上的标准内积定义为 \(\vec{a}\cdot \vec{b}=\sum a_i\overline{b_i}\),其中 \(a_i,b_i\) 为 \(\vec{a},\vec{b}\) 在标准基下的坐标。这意味着内积与选择的基无关。
若将内积定义为 \(\vec{a}\cdot \vec{b}=\sum a_i\overline{b_i}\),其中 \(a_i,b_i\) 为 \(\vec{a},\vec{b}\) 在基 \(S\) 下的坐标,则 \(S\) 是单位正交基。
对于模长、夹角和正交这些概念,也需要给出新的定义:
- 模长:\(||\vec{a}||=\sqrt{\vec{a}\cdot \vec{a}}\);
- 夹角:\(\theta=\arccos(\dfrac{\vec{a}\cdot \vec{b}}{||\vec{a}||\times||\vec{b}||})\);
- 正交:\(\vec{a}\cdot \vec{b}=0\)。
在一般的问题中,遇到的线性空间都是 \(F_p^n(F_p)\),需要仔细辨别该问题是否能用线性空间解决。
4. 线性变换与矩阵
4.1 线性变换
设 \(V,W\) 为 数域 \(F\) 上的线性空间,\(f\) 为一个 \(V\) 到 \(W\) 的映射。
若对于任意的 \(\vec{v}\in V,\vec{w}\in W,a\in F,b\in F\),满足 \(f(a\vec{v}+b\vec{w})=af(\vec{v})+bf(\vec{w})\),那么称 \(f\) 是 线性变换。
取 \(V\) 的一组基 \(S=\{\vec{v_1},\vec{v_2},\vec{v_3},\cdots \vec{v_n}\}\),那么只要知道 \(f(\vec{v_i})\),就可以求出 \(V\) 中所有向量的 \(f(\vec{v})\):设 \(\vec{v}=\sum c_i\vec{v_i}\),则 \(f(\vec{v})=\sum c_if(\vec{v_i})\)。
再取 \(W\) 的一组基 \(T=\{\vec{w_1},\vec{w_2},\vec{w_3},\cdots \vec{w_n}\}\)。设 \(f(\vec{v_i})=\sum a_{j,i}\vec{w_j}\),那么可以得到 \(f(\vec{v})=\sum_j (\sum_i c_ia_{j,i})\vec{w_j}\)。
记矩阵 \(M_f\) 为 \(a_{j,i}\) 的矩阵,即
于是对于 \(\vec{v}=\sum c_i\vec{v_i}\),\(f(\vec{v})\) 的计算可以写为:
可以看为,\(f(\vec{v})\) 即为 \((M_f)_{*,k}\) 与 \(c_k\) 相乘后得到的向量全部加起来。
也可以看为,\(f(\vec{v})\) 的第 \(k\) 维坐标为 \((M_f)_{k,*}\)与 \(\vec{v}\) 对应位相乘再相加的结果。
于是我们用一个矩阵表示了一个线性变换。
注意,在用矩阵描述向量或线性变换时,必须明确基,基不同得到的矩阵也不同。未言明基时,默认基为标准基。
4.2 矩阵乘法
考虑 \(F\) 上的线性空间 \(U,V,W\),设 \(g,f\) 分别为从 \(U\) 到 \(V\) 的,从 \(V\) 到 \(W\) 的线性变换。
设 \(\dim U=n,\dim V=m,\dim W=p\),考虑 \(f,g\) 的复合:
展开,得 \((M_{f\circ g})_{i,j}=\sum_k (M_f)_{i,k}(M_g)_{k,j}\)。
于是可以定义矩阵的乘法 \((AB)_{i,j}=\sum_k A_{i,k}B_{k,j}\),表示两个线性变换的复合。
这个过程需要保证 \(M_f\) 的列数与 \(M_g\) 的行数相等。\(n\times m\) 与 \(m\times p\) 的矩阵相乘会得到 \(n\times p\) 的矩阵。
由上面可以看出,矩阵乘法满足结合律,但不满足交换律。
有几个便于理解矩阵乘法的方式:
- \((AB )_{i,j}\) 为 \(A_{i,*}\)与 \(B_{*,j}\) 相乘的结果。
- 把 \(A_{*,k},B_{k,*}\) 拿出来相乘,共得到 \(m\) 个 $n\times p $ 的矩阵,全部相加得到 \(AB\);
- \((AB)_{*,i}\) 为 \(A\) 与 \(B_{*,i}\) 相乘的结果;
- \((AB)_{i,*}\) 为 \(A_{i,*}\) 与 \(B\) 相乘的结果。
4.3 矩阵的初等行变换
初等行变换分为三种:
- 交换矩阵不同的两行;
- 把矩阵的某一行乘上一个非 0 系数加到另一行上;
- 对某一行乘上一个非 0 系数。
对 \(n\times m\) 的矩阵 \(A\) 做初等行变换,等价于在其左边乘上了一个 \(n\times n\) 的矩阵 \(M\)。
例如,把 \(A\) 的第 \(x\) 行的 \(v\) 倍加到第 \(y\) 列上,可以令 \(M_{i,i}=1,M_{x,y}=v\),其余位置为 \(0\)。
4.4 矩阵的秩
对于一个 \(n \times m\) 的矩阵,我们把每一行看作一个 \(m\) 维向量,称这些向量为这个矩阵的 行向量。
同理,我们把每一列看作一个 \(n\) 维向量,称这些向量为这个矩阵的 列向量。
称行向量张成的空间为 行空间,称列向量张成的空间为 列空间 或 像空间。
以行向量作为生成子集的线性空间的维度称为这个矩阵的 行秩。类似地,我们有 列秩 的定义。
定理:对于任意一个矩阵,其行秩与列秩相等。
证明:
对矩阵 \(A\) 做初等行变换,行向量表出的空间保持不变。
高斯消元,利用初等行变换将原矩阵转化为对角矩阵。矩阵的行秩就是对角矩阵的非 0 行个数。
通过这个例子可以发现,对于对角矩阵进行初等列变换,得到列秩也等于非 0 行个数。
接下来需要证明对一个矩阵进行初等行变换之后,列向量表出的线性空间的维度不变。
设 \(m\) 维向量集合 \(S=\{ a_1,a_2,a_3,...,a_n \}\) 与 \(m\) 维向量 \(b\)。
\(S\) 能够表出 \(b\),当且仅当存在一组 \(k_1,k_2,...k_n\),满足:
把这个方程组写为增广矩阵形式:
对这个矩阵进行初等行变换,不会对 \(k\) 是否存在产生影响。
设 \(S\) 变换为 \(S'\),\(b\) 变换为 \(b'\)。对于任意的 \(b\),若能被 \(S\) 表出,则对应的 \(b'\) 也一定能够被 \(S'\) 表出。所以这个变换为双射。
不妨设 \(S\) 为 \({\rm span}(S)\) 的基,重新产生对应的 \(S'\)。设 \({\rm span}(S')\) 的基底为 \(P\)。
假设 \(|S|<|P|\),则 \(|S'|<|P|\)。由基的极小性,\(S'\) 不可能成为 \({\rm span(S')}\) 的张成集,矛盾。故得到 \(|S|\geq |P|\)。
由初等行变换的可逆性,同理可得 \(|S| \leq |P|\)。
于是有 \(|S|=|P|\)。初等行变换不会影响列向量的维度。
由此定义矩阵的 秩 为行秩或列秩或像空间的维度,记为 \({\rm rank}(A)\)。若秩等于行数则称该矩阵 行满秩,若秩等于列数则称该矩阵 列满秩。对于一个方阵,若其秩等于行数(或列数)则直接称其 满秩。
那么可以通过求矩阵的秩来判断该线性变换是否为单射、满射、双射。
设 \(A\) 是 \(n\times m\) 的矩阵,其线性变换 \(f\) 是 \(m\) 维空间到 \(n\) 维空间的映射。
- 若 \(f\) 是单射,则说明 \(A\) 的列向量线性无关,则 \({\rm rank}(A)=m\);
- 若 \(f\) 是满射,则说明 \(A\) 的列向量可以张成 \(n\) 维空间中的所有向量,则 \({\rm rank}(A)=n\);
- 若 \(f\) 是双射,则 \({\rm rank}(A)=n=m\),则 \(A\) 是满秩的方阵。
4.5 线性方程组
考虑 \(m\) 个 \(n\) 元一次方程组:
可以将其写为矩阵形式:
记为 \(A\vec{x}=B\)。本质上是在求一个向量 \(\vec{x}\) 满足 \(f(\vec{x})=\vec{b}\)。
高斯消元中做初等行变换时,本质上是在两边同时左乘了一个 \(m\times m\) 的可逆矩阵 \(E\)。
接下来讨论解的情况:
- 有唯一解,说明 \(f\) 是单射,则 \({\rm rank}(A)=n\);
- 有无穷多个解,说明 \(b\) 在 \(A\) 的像空间中,且 \(f\) 不是单射(也不一定是满射);
- 无解,则 \(b\) 不在 \(A\) 的像空间中。
4.6 矩阵乘法的单位元
矩阵乘法的单位元首先要是同一个线性空间中的映射,这直接要求了单位元必须是方阵。
记 \(I_n\) 为 \(n\times n\) 的单位元。那么对于一个 \(n\times m\) 的矩阵 \(A\),满足 \(AI_m=A,I_nA=A\)。
不难验证,\((I_n)_{i,j}=[i=j]\)。
\(I_n\) 是唯一的。反证法,设 \(M\) 也是 \(n\times n\) 的单位元,则有 $IM=I,IM=M $,得到 \(M=I\)。
4.7 矩阵乘法的逆元
定义矩阵 \(A\) 的乘法逆 \(A^{-1}\) 为满足 \(AA^{-1}=A^{-1}A=I\) 的矩阵。
定理:矩阵 \(A\) 有乘法逆,当且仅当 \(A\) 是满秩的方阵。
证明: 首先矩阵 \(A\) 有乘法逆,当且仅当其对应的线性变换是双射。
若 \(A\) 是方阵,则要求 \(A\) 满秩。
若 \(A\) 不是方阵,假设 \(A\) 为 \(n\times m\) 的矩阵。若 \(n<m\),则该矩阵是非双射的满射;若 \(n>m\),则该矩阵是非双射的单射。
求 \(A^{-1}\),考虑对其做初等行变换将其变为 \(I\)。那么 \(E_m\cdots E_2E_1A=I\) ,则 \(A^{-1}=E_m\cdots E_2E_1\)。
实现中,可以把 \(A,I\) 拼起来得到 \([A,I]\),然后把 \(A\) 消成 \(I\) 得到 \([I,B]\),则 \(B=A^{-1}\)。
void Inv(){
for(int i=1;i<=n;i++) a[i][i+n]=1;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(a[j][i]){
swap(a[i],a[j]);
break;
}
}
if(!a[i][i]) return puts("No Solution"),void();
ll inv=Quickpow(a[i][i],mod-2);
for(int j=i;j<=n+n;j++) (a[i][j]*=inv)%=mod;
for(int j=1;j<=n;j++){
if(i==j) continue;
int w=a[j][i];
for(int k=i;k<=n+n;k++)
a[j][k]=(a[j][k]-w*a[i][k]%mod+mod)%mod;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%lld ",a[i][j+n]);
puts("");
}
}
4.8 矩阵的转置
设 \((A^T)_{i,j}=A_{j,i}\),称 \(A^T\) 为 \(A\) 的 转置。
不难证明,\((AB)^T=B^TA^T\)。
若该空间是复线性空间,需要定义 \(A\) 的 共轭转置 \(A^H\) 为 \((A^H)_{i,j}=\overline{A_{j,i}}\)。
4.9 正交变换与正交矩阵
设线性变换 \(f\) 为 \(V\) 到 \(V\) 的映射。
若 \(\forall \vec{a},\vec{b}\in V,\vec{a}\cdot\vec{b}=f(\vec{a})\cdot f(\vec{b})\),那么称该变换为 正交变换。
性质:\(f\) 是正交变换,当且仅当其在单位正交基下的矩阵 \(P\) 满足 \(P^TP=I\)。
证明:取 \(V\) 的单位正交基 \(B=\{\vec{v_1},\vec{v_2},\cdots,\vec{v_n}\}\)。
任取 \(V\) 中两向量 $ \vec{a}=\sum c_i\vec{v_i},\vec{b}=\sum d_i\vec{v_i}$。
\(\vec{a}\cdot \vec{b}=\sum c_id_i\),\(f(\vec{a_i})\cdot f(\vec{b_i})=(\sum c_if(\vec{v_i}))\cdot(\sum d_if(\vec{v_i}))=\sum_i\sum_jc_id_jf(\vec{v_i})\cdot f(\vec{v_j})\)。
二者相等,当且仅当 \(f(\vec{v_i})\cdot f(\vec{v_j})=[i=j]\),即 \(P\) 的列向量两两正交且模长为 \(1\),即 \(P^TP=I\)。
则定义单位正交基下满足 \(P^TP=I\) 的矩阵为 正交矩阵。
5. 异或空间
5.1 异或空间
异或空间即为 \(R_2^n(R_2)\),其中 \(R_2\) 为模 \(2\) 剩余系,即 \(\{0,1\}\)。
考虑如何求出异或空间的基。将每个整数看作一个 \(m\) 维二进制数,这个二进制数又表示了一个 \(m\) 维向量。
类似于普通线性空间,将这 \(n\) 个数看作 \(n\times m\) 的矩阵,进行 \(\bmod 2\) 意义下的初等行变换,转化为简化阶梯型矩阵。
例如 \(5,12,2,7,9\) 这 \(n\) 个数得到的基为 \(9,5,2\),过程如下:
void Gauss(){
int r=1,c=63;
for(;c>=0;c--){
int t=0;
for(int i=r;i<=n;i++){
if(a[i]>>c&1){
t=i;
break;
}
}
if(!t) continue;
swap(a[t],a[r]);
for(int i=1;i<=n;i++){
if((a[i]>>c&1)&&i!=r)
a[i]^=a[r];
}
r++;
}
}
还有一种可以支持动态插入、动态查询的线性基实现方式,本质上也是在做初等行变换。
void Insert(ll x){
for(int i=63;i>=0;i--){
if(!(x>>i&1)) continue;
if(!b[i]){
for(int j=0;j<i;j++){
if(x>>j&1)
x^=b[j];
}
for(int j=i+1;j<=63;j++){
if(b[j]>>i&1)
b[j]^=x;
}
b[i]=x;
return;
}
else x^=b[i];
}
}
5.2. 异或线性基的应用
Problem A
有 \(n\) 个整数 \(a_1,a_2,a_3,...a_n\) 与 \(Q\) 组询问,每个询问给出一个 \(k\),求 \(a_1,a_2,...a_n\) 中选出若干个数字(不能不选)执行异或运算能够得到的整数集合中(去掉重复的数)第 \(k\) 小的整数是多少。
对这 \(n\) 个数构成的异或空间求基。设求出的基为 \(b_1,b_2,b_3,...b_t\),并使其严格递减。
在高斯消元求基的过程中,每个 \(b_i\) 代表了一个主元。主元的最高位的 1 所在的位数 \(c_i\) 显然两两不同。
首先,在这 \(t\) 个数中选取一个非空子集的方案数为 \(2^t-1\)。
如果选了 \(b_1\),由于其他的数字在第 \(c_1\) 位上都是 0,那么选了 \(b_1\) 得出的数字一定比没有选 \(b_1\) 得出的数字大。
不选 \(b_1\) 方案数为 \(2^{t-1}-1\),则选择 \(b_1\) 得出的最小的数是第 \(2^{t-1}\) 大。
同理,选择 \(b_1\) 且选择 \(b_2\) 得出的数字中最小的一个是第 \(2^{t-1}+2^{t-2}\) 大。
于是我们可以对 \(k\) 进行二进制分解。从低位到高位,若 \(k\) 的第 \(i\) 位是 1,那么就需要选择 \(b_{t-i}\)。
需要注意的是,题目要求的第 \(k\) 小所在的集合不能重复。
如果 \(a_1,a_2,a_3,...a_n\) 进行异或运算得不出 0,则无需特判;反之,就需要跳过 0,求 \(b_1,b_2,...b_t\) 能表出的第 \(k-1\) 大的数。
题目要求的是一个 “去重异或集合”,但 \(a_1,a_2,...a_n\) 张成的是一个 ”可重异或集合“。
首先通过 \(b_1,b_2,...b_t\) 的不同子集进行异或运算生成的数字一定两两不同,共有 \(2^t\) 个,这也是异或空间的大小。
接下来我们在其余的 \(n-t\) 个数字中选择若干个数字的方案数为 \(2^{n-t}\)。
设其中一个子集进行异或得到的数字为 \(x\),用 \(x\) 与基底生成的 \(2^t\) 个数字分别异或,又可以得到 \(2^t\) 个两两不同的数字,也就是刚好遍历了异或空间一次。
于是我们得到,”可重异或集合“ 由 ”不重异或集合“ 重复 \(2^{n-t}\) 次得到。
void Gauss(){
zero=0;
for(int i=1;i<=n;i++){
int t=0; ll mx=0;
for(int j=i;j<=n;j++){
if(a[j]>mx){
mx=a[j];
t=j;
}
}
if(!mx){
zero=1,n=i-1;
break;
}
swap(a[t],a[i]);
for(int p=63;p>=0;p--){
if(!(a[i]>>p)&1) continue;
for(int l=1;l<=n;l++){
if(l!=i&&(a[l]>>p&1))
a[l]^=a[i];
}
break;
}
}
}
void Solve(){
read(n);
for(int i=1;i<=n;i++) read(a[i]);
Gauss();
read(Q);
while(Q--){
ll k; read(k);
if(zero) k--;
if(k>=(1ll<<n)){
puts("-1");
continue;
}
ll ans=0;
for(int i=n-1;i>=0;i--){
if(k>>i&1)
ans^=a[n-i];
}
printf("%lld\n",ans);
}
}
Problem B
__给定 \(n\) 个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。 __
对这 \(n\) 个整数表出的异或空间求最简线性基,答案就是基底的每个元素的异或和。
Problem C
给定一张无向连通带权图 \(G\),求 \(1\) 到每个点异或和最大的路径(可以不是简单路径)。
不难观察出,\(1\) 到 \(i\) 的路径可以看作是任意一条简单路径异或上若干个环得到的。
那么考虑求出环的线性基。暴力枚举环显然不可行,我们需要一些性质:
设 \(T\) 为以 \(1\) 为根的生成树。设 \(f(u)\) 为树上 \(1\) 到 \(u\) 的路径异或和。
引理:设环的异或和集合为 \(A\),所有非树边的 \(w(u,v) \ {\rm xor}\ f(u)\ {\rm xor} \ f(v)\) 的集合为 \(B\),则 \(A=B\)。
首先若干条非树边的 \(w(u,v) \ {\rm xor}\ f(u)\ {\rm xor} \ f(v)\) 的异或和一定可以对应一个大环。所以 \(B\subseteq A\)。
然后考虑一个环 \(\{e_1,e_2,\cdots,e_m\}\)。\({\rm xor}_{i=1}^m\ w(e_i)={\rm xor}_{i=1}^m (w(e_i)\ {\rm xor} f(u_i) \ {\rm xor} f(v_i))\)。
若 \(e_i\) 为树边,那么 \(w(e_i)\ {\rm xor} f(u_i) \ {\rm xor} f(v_i)=0\)。于是 \(A\subseteq B\),得到 \(A=B\),得证。
所以可以先随便搞出一棵生成树,然后把非树边的 \(w(u,v) \ {\rm xor}\ f(u)\ {\rm xor} \ f(v)\) 扔进线性基里即可。
6. 矩阵的行列式
6.1 行列式的定义
先考虑 \(\mathbb{R}^n(\mathbb{R})\)。对于方阵 \(A\),定义其行列式 \(\det A\) 的绝对值表示标准基经过该线性变换后围成的多面体体积,正负号表示有没有被翻转。也可记为 \(|A|\)。
由几何意义可以推出:
-
\(\det I=1\);
-
交换矩阵两列,行列式变号;
-
行列式满足列的多重线性性:
\(\det [\vec{v_1},\cdots,c\vec{u}+d\vec{v},\cdots,\vec{v_n}]=c\times \det[\vec{v_1},\cdots \vec{u},\cdots,\vec{c_n}]+d\times \det[\vec{v_1},\cdots \vec{v},\cdots,\vec{c_n}]\)。
在更抽象的线性空间中,以上面三条性质作为行列式的严谨定义。
注意,只有方阵的行列式才有定义,讨论不是方阵的矩阵的行列式没有意义。
6.2 行列式的性质
设 \(A\) 为 \(n\times n\) 的方阵。
-
若 \(A\) 有 \(0\) 列,则 \(\det A=0\)。
将 \(\vec{0}\) 看作 \(\vec{0}+\vec{0}\),由列的多重线性性,\(\det A=\det A+\det A\),则 \(\det A=0\)。
-
若 \(A\) 有相同的两列,则 \(\deg A=0\)。
交换相同两行,\(\det A=-\det A\)。
-
给 \(A\) 的一列加上 \(v\) 倍的另一列,\(\det A\) 不变。
-
给 \(A\) 的一列乘上 \(k\),\(\det A\) 也要乘上 \(k\)。
-
若 \(A\) 的列向量线性相关(即不满秩),\(\det A=0\)。
-
\(\det(kA)=k^n(\det A)\)。
-
\(\det (AB)=\det A\det B\)。
从线性变换的复合角度考虑。
6.3 莱布尼茨公式
将 \(A\) 的列向量写为标准基的线性组合:\(A_{*,j}=\sum a_{i,j}\vec{e_i}\)。
那么
只有 \(i_1,\cdots i_n\) 构成 \(1\sim n\) 的排列时才有意义。
接下来考虑对于一个排列 \(p\),其对应的矩阵 \(P\) 行列式是多少。
首先有观察:
- 交换排列 \(p\) 两个元素,逆序对数的奇偶性会改变。
- 可以通过交换 \(p\) 的两个元素把 \(P\) 变为 \(I\)。
结合 \(\det I=1\),可得 \(\det P=(-1)^{inv(p)}\),\(inv(p)\) 表示 \(p\) 的逆序对数。
于是得到莱布尼茨公式:
6.4 莱布尼茨公式的推论
推论 1:对于上三角矩阵,其行列式等于对角线上元素的乘积。
推论 2:\(\det A=\det A^T\)。
对于一个排列 \(p\),设其逆排列为 \(q\),则 \(inv(q)=inv(p)\)。
那么 \((-1)^{inv(p)}a_{p_1,1} a_{p_2,2} a_{p_3,3}\cdots a_{p_n,n}=(-1)^{inv(q)} a_{1,q_1}a_{2,q_2} a_{3,q_3}\cdots a_{n,q_n}=(-1)^{inv(q)}a^T_{q_1,1} a^T_{q_2,2}\cdots a^T_{q_n,n}\)。
代回莱布尼茨公式,得到 \(\det A=\det A^T\)。
那么上面对于列的性质对行也成立。
对于一个矩阵 \(A\),可以先用高斯消元将其变成上三角矩阵,然后直接求行列式。
推论 3:\(\det A\ne 0\) 当且仅当 \(A\) 满秩。
6.5 [模板] 行列式求值
模数不一定是质数,此时考虑对两行辗转相除,即 \(a_{j}\leftarrow a_{j}-a_{i}\times \lfloor\frac{a_{j,i}}{a_{i,i}} \rfloor\),一定能把某一行的对应元消成 \(0\)。
对固定的 \(i\),相当于向下对所有数取 gcd,gcd 只会变化 \(O(\log p)\) 次,所以只需要做 \(O(n+\log p)\) 次消元。
总复杂度 \(O(n^2(n+\log p))\)。
ll Det(){
ll ans=1;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
while(a[i][i]){
ll d=a[j][i]/a[i][i];
for(int k=i;k<=n;k++) a[j][k]=(a[j][k]-d*a[i][k]%mod+mod)%mod;
swap(a[i],a[j]);
ans=mod-ans;
}
swap(a[i],a[j]);
ans=mod-ans;
}
}
for(int i=1;i<=n;i++) (ans*=a[i][i])%=mod;
return ans%mod;
}
7. 矩阵树定理
对于一个有向图,设其邻接矩阵 \(A\) 为 \(A_{i,j}=[(i,j)\in E]\),其出度矩阵为 \(D_{i,i}=out_i\)。定义拉普拉斯矩阵 \(L=D-A\),\(L_r\) 为去掉 \(L\) 的第 \(r\) 行第 \(r\) 列得到的矩阵。
定理:以 \(r\) 为根的内向生成树个数,即为 \(\det L_r\)。
证明:
除了 \(r\) 之外,每一个点都选择其他的一个点作为父亲,则一个方案合法当且仅当不出现环。
容斥,钦定一些环必须出现,其余点可以任意选择。容斥系数即为 \((-1)^m\)。
而这个钦定的过程可以看作是枚举排列,钦定的环即为大小不为 \(1\) 的置换环。
回到 \(L_r\),由莱布尼茨公式,\(\det L_r=\sum_{p\in S_{n-1}} (-1)^{inv(p)}\prod (L_r)_{i,p_i}\)。
\((L_r)_{i,i}\) 为 \(i\) 任意选择的方案,\((L_r)_{i,p_i}\) 为 \(-[(i,p_i)\in E]\),其中 \(i\ne p_i\)。
设 \(p\) 中大小不为 \(1\) 的置换环分别为 \(l_1,l_2,\cdots,l_m\)。在 \(\prod(L_r)_{i,p_i}\) 中,已经带上了 \((-1)^{\sum l_i}\) 的系数。
把一个排列通过交换两个位置排序,需要的交换次数为 \(\sum(l_i-1)\)。于是 \((-1)^{inv(p)}=(-1)^{\sum (l_i-1)}=(-1)^{-\sum(l_i-1)}\)。两个系数相乘得 \((-1)^{m}\)。得证。
不难得到,若定义入度矩阵 \(D_{i,i}=in_i\),则 \(\det L_r\) 为以 \(r\) 为根的外向生成树个数。也不难扩展到无向图。
若图中有自环,不会影响答案,因为 \(D-A\) 会抵消。若图中有重边,则将 \(A_{i,j}\) 改为 \(i\rightarrow j\) 的边数。
进一步地,矩阵树定理可以重新表述为:
其中 \(S(r)\) 为所有以 \(r\) 为根的内向生成树的集合。
若要求生成树之和的和,可以设 \(A_{i,j}=(1+w_{i,j}x)\),进行 \(\bmod x^2\) 下的多项式乘法即可。
8. LGV 引理
设一条路径 \(P\) 的权值 \(w(P)\) 为路径上所有边的边权之积,一个路径组 \(Q\) 权值为 \(\prod_{P_i\in Q} w(P_i)\)。
在有向无环图 \(G\) 上,有两个不相交且大小相等的点集 \(A,B\)。设 \(e_{i,j}\) 为所有 \(A_i\rightarrow B_j\) 的路径权值和,\(M\) 为 \(e\) 的矩阵。
设 \(p\) 为 \(1\sim n\) 的排列,定义 \(f(p)\) 为所有 \(i\rightarrow p_i\) 的不交路径组的权值和,\(g(p)\) 为所有 \(i\rightarrow p_i\) 的路径组的权值和。则:
证明:
不交路径组对两边的贡献都是 \((-1)^{inv (p)}\)。
接下来考虑有交路径组 \(S\)。找到编号最小的 \(>1\) 条路径经过的点 \(u\),经过 \(u\) 的路径中两个编号最小的起点分别为 \(x,y\)。交换 \(x,y\) 对应的路径在 \(u\) 之前的部分。设 \(S\) 变换为 \(S'\),\(f(S)=S'\)。
可以证明 \(S'\) 对应的 \(u',x',y'\) 和 \(S\) 的 \(u,x,y\) 是一样的,得到 \(f(f(S))=S\)。
而 \(S'\) 对应的排列是 \(S\) 的排列交换了 \(x,y\) 得到,于是两个排列奇偶性不同,贡献为 \(0\)。得证。

浙公网安备 33010602011771号