线性代数基础
煎蛋的东西不再赘述。
n 个向量,若存在向量能被其他向量线性表示,则称这些向量线性相关,否则线性无关。
矩阵的行秩,将矩阵看成若干个行向量,从这些向量中选取尽可能多的向量满足这些向量线性无关,选取的个数 k 即为矩阵的秩。
矩阵的列秩同理,一般来说,矩阵的秩默认为行秩。
行列式常用定理
定义:对一个 n×n 的矩阵 A,其 n 阶行列式写作 det(A)。
det(A)=∑p(−1)τ(p)n∏i=1ai,pi
p 为所有可能的排列,τ(p) 表示一个排列 p 的逆序对个数。
定理一:det(AT)=det(A),即矩阵转置后值不变。
证明:考虑对于原来的每个排列 p ,在转置后对应的 ai,pi 变成 api,i,只需证明两者的逆序对个数相同。
那么考虑如果存在两个下标 i,j 满足 i<j 且 pi>pj,会对有 1 的贡献,那么在转置后 pj<pi 且 j>i,也会有 1 的贡献。
定理二:对换矩阵的某两行行列式的值取相反数。
考虑对于任意一个排列 p,对换矩阵两行的影响相当于对换排列的两个值。
如果这两个值相邻,无论两者谁更大都会对逆序对个数造成 ±1 的贡献。
考虑一般情况,如果中间间隔了 k 个数,那么对换两个值相当于在中间进行了 2m+1 次相邻对换,每次相邻对换均会造成 ±1 的贡献,所以最终也会改变排列的奇偶性,即对行列式的贡献取反。
推论:如果有矩阵有两行相同,则行列式值为 0。
对换两行,那么行列式取值为负,又因为交换两行后矩阵一模一样,即 det(A)=−det(A),推出行列式为 0。
定理三:
∣∣
∣
∣
∣
∣
∣∣a1,1a1,2⋯a1,na2,1a2,2⋯a2,n⋮⋮⋱⋮b1+c1b2+c2⋯bn+cnan,1an,2⋯an,n∣∣
∣
∣
∣
∣
∣∣=∣∣
∣
∣
∣
∣
∣∣a1,1a1,2⋯a1,na2,1a2,2⋯a2,n⋮⋮⋱⋮b1b2⋯bnan,1an,2⋯an,n∣∣
∣
∣
∣
∣
∣∣+∣∣
∣
∣
∣
∣
∣∣a1,1a1,2⋯a1,na2,1a2,2⋯a2,n⋮⋮⋱⋮c1c2⋯cnan,1an,2⋯an,n∣∣
∣
∣
∣
∣
∣∣
把行列式展开,每一项都有 (bpi+cpi),再把括号打开即可得到后者。
定理四:将矩阵的某一行乘上一个系数 k,行列式的值也会乘上 k
证明:还是把行列式展开,把每一项的 k 都提取出出来即可。
定理五:将某一行加上另外一行常数倍,行列式的值不变。
证明:结合定理三和定理四即可,读者自证不难。
定理六:上三角矩阵的行列式值为主对角线上所有值相乘。
证明:除了主对角线的排列以外其他值都有系数为 0 的值。
利用以上定理就可以利用高斯消元得到行列式的取值了!
定理七:降价行列式/行列式展开/拉普拉斯展开:行列式的值等于所有元素于他们的代数余子式的乘积之和。
n×n 的矩阵 a,定义 Ai,j 为 ai,j 的代数余子式。
关于矩阵中一个位置 ai,j 的余子式指的是忽略第 i 行第 j 列,剩下的元素拼在一次的行列式的值。
代数余子式指的是余子式再乘 (−1)i+j。
即:
det(a)=n∑j=1ai,jAi,j
首先很好理解的是余子式乘上当前元素的值,相当于给排列添加了一个元素。
唯一需要证明的是系数 (−1)i+j。
证明:先用定义式将行列式展开,考虑枚举第 i 行的 pi 为 j。
设 1∼i−1 中有 x 个 pv 大于 j,那 i+1∼n 中有 j−1−(i−1−x)=j−i+x 个小于 j 的。那么对逆序对的贡献为 j−i+x+x。
那么有 (−1)j−i+x+x=(−1)j−i=(−1)i+j。
有趣的小牛牛题,已知 1798,2139,3255,4867 为 31 的倍数,请在不暴力展开行列式的情况下证明其值为 31 的倍数。
∣∣
∣
∣
∣∣1798213932554867∣∣
∣
∣
∣∣
将第一列乘上 1000 倍,第二列乘上 100 倍,第三列乘上 10 倍加到第四列上,再对第四列行列式展开,发现 ai,j 都为 31 的倍数。
范德蒙德行列
∣∣
∣
∣
∣
∣∣a01a02⋯a0na11a12⋯a1n⋮⋮⋱⋮an−11an−12⋯an−1n∣∣
∣
∣
∣
∣∣=∏1≤i<j≤n(aj−ai)
证明:
用一些定理取化简它,分两步:
第一步:将 n−1 行的 −a1 倍加到第 n 行,再将第 n−2 行的 −1 倍,第 1 行的 −x1 倍加到第 2 行。 得到:
∣∣
∣
∣
∣
∣∣11⋯10a2−a1⋯an−an−1⋮⋮⋱⋮0an−22(a2−a1)⋯an−2n(an−a1)∣∣
∣
∣
∣
∣∣
使用行列式展开把第一列展开,发现值其实是忽略第一行第一列的答案。
在对于右下角的那个矩形,每一列都提取出一个 (ai−a1)。
再不断对剩下的矩形做如此操作即可得到答案。
以及一个很优美的式子:
det(AB)=det(A)det(B)
这是著名的柯西–比内公式,笔者很想去仔细证明,但是各种细节讨论最终放弃了,有兴趣的读者可以去看看。
煎蛋例题:
重新审视矩阵的秩,矩阵的秩的意义,也可以理解为非零子式的最大阶数,也就是说,我们要找到一个最大的子式使得其行列式不为零。
考虑行列式的定义。
det(A)=∑p(−1)τ(p)n∏i=1ai,pi
这里的矩阵 a 为邻接矩阵,所以说如果 ai,pi 有值,那么存在边 (i,pi),又因为原图不存在环,所以排列中只能存在长度为 2 的循环,换言之,每个 i 只能和一个对应的 pi 匹配。
那么就转化为求森林的最大匹配数的两倍的期望。
煎蛋树形 dp 即可,设 fx 表示 x 没有被匹配的概率。
fx=∏y∈sonx(1−fy+fy2)ans=n∑i=1(1−fx)
设 fi,j 表示前 i 行秩为 j 的矩阵数量。
fi,j=fi−1,j×pj+fi−1,j−1×(pn−pj−1)
即两种情况,当前秩不增加即为前面的行向量组合得来,有 pj 种方案,或者当前秩增加,有 (pn−pj−1) 种方案。
最后求得是一行 f 的所有值。
放到二维平面上,每次可以从 (i,j) 走到 (i+1,j) 水平步,或者 (i+1,j+1) 右上步。
那么对于一个终点 f(n,j),一定恰好走了 j 次右上步,每次的贡献都是确定的,考虑设 gi,j 在 1∼n 层走了若干次水平步,在第 i 层走水平步贡献为 pi,恰好走了 j 次水平步的方案数。
那么:
fi,j=gj,i−j×r∏k=1(pn−pk−1)
现在考虑求解 g,对每一列直接上生成函数:Gi(x)=∑j≥0gi,jxj
Gi(x)=i∏j=0∑l≥0(pjx)l=i∏j=011−pjx
记:这里貌似可以使用科技很简便地得到答案。
Gi(px)=i∏j=011−pj+1x(1−x)Gi(x)=(1−pi+1x)Gi(px)
带入第 r 次项的系数:
gi,r−gi,r−1=pr×gi,r−pi+1×pr−1×gi,r−1gi,r=pi+r−1pr−1×gi,r−1gi,r=r∏j=1pi+j−1pj−1fn,r=n−r∏j=1pr+jpj−1∏r∑j=1(pn−pj−1)
递推从小到大维护 fn,i 即可。
真心煎蛋题,考虑随机一个 n×1 的向量 D(每一位值非零),我们只需要检查 D×A×B=D×C
错误概率分析:这个方法本质上检验了 D×(A×B−C) 是否为 0,设 G=A×B−C
首先如果 G 全零,那么一定不会判错。
否则假设最终答案 (1,v) 判错了,即:
n∑i=1D1,iGi,v=0
先算得前 n−1 项的答案,最后一项 D1,i 的取值对应着恰好一个答案的取值,那么错误概率为 1998244353
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具