参考资料:
求解A的代数余子式:
(1)rank(A)<=n-2,每个位置均为0
(2)rank(A)=n,有 A ∗ = ∣ A ∣ ∗ A − 1 A^*=|A|*A^{-1} A∗=∣A∣∗A−1,其中A*是代数余子式矩阵的转置矩阵,实现的时候需要注意这点
(3)rank(A)=n-1,则求出非0行向量p,满足pA=0,以及非0列向量q,满足Aq=0
找出一对r,c,满足 p r ≠ 0 , q c ≠ 0 p_r\neq 0,q_c\neq 0 pr=0,qc=0,我们有 A i , j = p i q j p r q c A r , c A_{i,j}=\frac{p_iq_j}{p_rq_c}A_{r,c} Ai,j=prqcpiqjAr,c
实现的时候,为了方便可以设置 p r = 1 , q c = 1 p_r=1,q_c=1 pr=1,qc=1
至于求解一个矩阵的秩,模拟高斯消元,还剩下多少个非0的行向量就是矩阵的秩
至于求解一个矩阵的逆,由于保证了逆是良定义的,所以一定可以用:
1.一行乘上某个数
2.一行乘上某个数加到某行
2.交换两行
变成单位矩阵
注意到,上面3个变换都可以表示成矩阵,意思是你求出了个
E k . . . . E 1 A = I E_k....E_1A=I Ek....E1A=I,那么 E k . . E 1 = A − 1 E_k..E_1=A^{-1} Ek..E1=A−1
上面的时间复杂度都是 O ( n 3 ) O(n^3) O(n3)
例题
求出代数余子式后随便做
复杂度: O ( n 3 + m ) O(n^3+m) O(n3+m)
正经人谁考场上写代数余子式啊
#include<bits/stdc++.h>
using namespace std;
const int Mod=1000000007;
int n,m;
#define Maxn 305
#define E 100010
struct Edge{
int s,e,t;
}edge[E