定义
这是一个函数,符号为 d e t det det,施加于大小为 n × n n\times n n×n 的矩阵。
计算方式
首先,我们定义 τ \tau τ 表示一个数列的逆序数(在 O I OI OI 界咱们一般叫逆序对数),比如 τ ( 3 , 1 , 2 ) = 2 \tau(3,1,2)=2 τ(3,1,2)=2。
而行列式的计算方式就是:从矩阵中拿出 n n n 个元素,要求他们都在不同的行和列上(换句话说,每行取一个元素,要求任意两个元素不在同一列上),然后它们的贡献就是 ( − 1 ) τ (-1)^\tau (−1)τ(每个元素所在的列) × \times × 元素乘积之和。
要注意的是,每个元素所在的列是按照其所在行排序的。比如说,有三个元素,位置分别为 ( 1 , 2 ) , ( 2 , 3 ) , ( 3 , 1 ) (1,2),(2,3),(3,1) (1,2),(2,3),(3,1),那么将它们所在的列按行排序就是 2 , 3 , 1 2,3,1 2,3,1。
然后将所有情况的贡献加起来,就得到了行列式的值。
举个栗子,对于这样一个矩阵,求它的行列式就是:
det
∣
1
0
2
0
3
0
2
0
1
∣
=
(
−
1
)
τ
(
1
,
2
,
3
)
×
1
×
3
×
1
+
(
−
1
)
τ
(
3
,
2
,
1
)
×
2
×
3
×
2
=
3
−
12
=
−
9
\det\left| \begin{matrix} 1 & 0 & 2\\ 0 & 3 & 0\\ 2 & 0 & 1 \end{matrix} \right|=(-1)^{\tau(1,2,3)}\times 1 \times 3 \times 1+(-1)^{\tau(3,2,1)}\times 2 \times 3 \times 2\\ =3-12=-9
det∣∣∣∣∣∣102030201∣∣∣∣∣∣=(−1)τ(1,2,3)×1×3×1+(−1)τ(3,2,1)×2×3×2=3−12=−9
写成数学柿子就是: det ( A ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( j 1 , j 2 , . . . , j n ) × a 1 , j 1 × a 2 , j 2 × . . . × a n , j n \det(A)=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(j_1,j_2,...,j_n)}\times a_{1,j_1} \times a_{2,j_2}\times ... \times a_{n,j_n} det(A)=∑j1=j2=...=jn(−1)τ(j1,j2,...,jn)×a1,j1×a2,j2×...×an,jn
可能不太标准?能看就行了qwq
行列式的性质
性质1
交换任意两行会使得行列式的值变成相反数。
设原矩阵为 A A A,里面的元素记为 a i , j a_{i,j} ai,j。
假设交换了第 i i i 行和第 k k k 行,设交换后的矩阵为 A ′ A' A′,里面的元素记为 a i , j ′ a'_{i,j} ai,j′。(下面一定要区分开 A , a i , j A,a_{i,j} A,ai,j 和 A ′ , a i , j ′ A',a'_{i,j} A′,ai,j′,另外说一句, a i , j ′ a'_{i,j} ai,j′ 下面没用到……只是为了做个区分qwq)
没交换时,柿子就像上面那样:
det ( A ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( . . . , j i , . . . , j k , . . . ) × a 1 , j 1 × . . . × a i , j i × . . . × a k , j k × . . . \det(A)=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(...,j_i,...,j_k,...)}\times a_{1,j_1} \times ... \times a_{i,j_i} \times ... \times a_{k,j_k} \times ... det(A)=∑j1=j2=...=jn(−1)τ(...,ji,...,jk,...)×a1,j1×...×ai,ji×...×ak,jk×...
交换后,柿子变成:
det ( A ′ ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( . . . , j i , . . . , j k , . . . ) × a 1 , j 1 × . . . × \det(A')=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(...,j_i,...,j_k,...)}\times a_{1,j_1} \times ... \times det(A′)=∑j1=j2=...=jn(−1)τ(...,ji,...,jk,...)×a1,j1×...× a k , j i a_{k,j_i} ak,ji × . . . × \times ... \times ×...× a i , j k a_{i,j_k} ai,jk × . . . \times ... ×...
这其实等价于:
det ( A ′ ) = ∑ j 1 ≠ j 2 ≠ . . . ≠ j n ( − 1 ) τ ( . . . , \det(A')=\sum_{j_1\ne j_2\ne...\ne j_n} (-1)^{\tau(...,} det(A′)=∑j1=j2=...=jn(−1)τ(..., j k ^{j_k} jk , . . . , ^{,...,} ,..., j i ^{j_i} ji , . . . ) × a 1 , j 1 × . . . × a i , j i × . . . × a k , j k × . . . ^{,...)}\times a_{1,j_1} \times ... \times a_{i,j_i} \times ... \times a_{k,j_k} \times ... ,...)×a1,j1×...×ai,ji×...×ak,jk×...
接下来看一下 j i j_i ji 和 j k j_k jk 的位置调换会引发什么:
设他们之间(不包括 i , k i,k i,k)有 N N N 个元素,其中有 x x x 个比 j i j_i ji 小,有 y y y 个比 j k j_k jk 大。
如果只看与 j i j_i ji 和 j k j_k jk 相关的逆序对,调换前 τ ( j i , . . . , j k ) = x + y \tau(j_i,...~,j_k)=x+y τ(ji,... ,jk)=x+y,调换后 τ ( j k , . . . , j i ) = 2 N − x − y \tau(j_k,...~,j_i)=2N-x-y τ(jk,... ,ji)=2N−x−y,变化量为 2 N − 2 x − 2 y 2N-2x-2y 2N−2x−2y,另外,交换这两个元素肯定会使得逆序数 + 1 +1 +1 或 − 1 -1 −1,所以变化量为 2 N − 2 x − 2 y ± 1 2N-2x-2y\pm1 2N−2x−2y±1,是个奇数,而 − 1 -1 −1 的指数加上一个奇数的话,就相当于变成原来的相反数了。
性质2
同一行的元素的公因数可以提出来。
像这样:
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
×
x
a
i
,
2
×
x
⋯
a
i
,
n
×
x
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
=
x
×
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
a
i
,
2
⋯
a
i
,
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
\det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1}\times x & a_{i,2} \times x & \cdots & a_{i,n}\times x\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=x\times \det \left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|
det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1×x⋮an,1a1,2a2,2⋯ai,2×x⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n×x⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣=x×det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1⋮an,1a1,2a2,2⋯ai,2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣
就是简单的结合律,不证明了。
性质3
如果一个矩阵有两行相同,那么行列式的值为 0 0 0。
证明很简单,设原矩阵为 A A A,交换相同的两行后的矩阵为 A ′ A' A′,那么有 det ( A ) = − det ( A ′ ) \det(A)=-\det(A') det(A)=−det(A′),因为 A = A ′ A=A' A=A′,所以 det ( A ) = 0 \det(A)=0 det(A)=0。
性质4
这个懒得描述了……直接上公式:
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
+
b
1
a
i
,
2
+
b
2
⋯
a
i
,
n
+
b
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
=
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
a
i
,
2
⋯
a
i
,
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
+
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
b
1
b
2
⋯
b
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
\det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1}+b_1 & a_{i,2}+b_2 & \cdots & a_{i,n}+b_n\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|= \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|+ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ b_1 & b_2 & \cdots & b_n\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|
det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1+b1⋮an,1a1,2a2,2⋯ai,2+b2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n+bn⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣=det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1⋮an,1a1,2a2,2⋯ai,2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣+det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮b1⋮an,1a1,2a2,2⋯b2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮bn⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣
简单的分配律,也不证明了。
性质5
将矩阵的某一行加上另外一行乘以某个倍数的积,行列式的值不变。
证明的话结合上面的性质也很容易得出:
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
+
a
j
,
1
×
x
a
i
,
2
+
a
j
,
2
×
x
⋯
a
i
,
n
+
a
j
,
n
×
x
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
=
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
a
i
,
2
⋯
a
i
,
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
+
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
j
,
1
×
x
a
j
,
2
×
x
⋯
a
j
,
n
×
x
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
=
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
a
i
,
2
⋯
a
i
,
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
+
x
×
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
j
,
1
a
j
,
2
⋯
a
j
,
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
=
det
∣
a
1
,
1
a
1
,
2
⋯
a
1
,
n
a
2
,
1
a
2
,
2
⋯
a
2
,
n
⋮
⋯
⋱
⋮
a
i
,
1
a
i
,
2
⋯
a
i
,
n
⋮
⋯
⋱
⋮
a
n
,
1
a
n
,
2
⋯
a
n
,
n
∣
\det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1}+a_{j,1}\times x & a_{i,2}+a_{j,2}\times x & \cdots & a_{i,n}+a_{j,n}\times x\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=\\ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|+ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{j,1}\times x & a_{j,2}\times x & \cdots & a_{j,n}\times x\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=\\ \det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|+ x\times\det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{j,1} & a_{j,2} & \cdots & a_{j,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|=\det\left| \begin{matrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{i,1} & a_{i,2} & \cdots & a_{i,n}\\ \vdots & \cdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}\\ \end{matrix} \right|
det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1+aj,1×x⋮an,1a1,2a2,2⋯ai,2+aj,2×x⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n+aj,n×x⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣=det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1⋮an,1a1,2a2,2⋯ai,2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣+det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮aj,1×x⋮an,1a1,2a2,2⋯aj,2×x⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮aj,n×x⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣=det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1⋮an,1a1,2a2,2⋯ai,2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣+x×det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮aj,1⋮an,1a1,2a2,2⋯aj,2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮aj,n⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣=det∣∣∣∣∣∣∣∣∣∣∣∣∣∣a1,1a2,1⋮ai,1⋮an,1a1,2a2,2⋯ai,2⋯an,2⋯⋯⋱⋯⋱⋯a1,na2,n⋮ai,n⋮an,n∣∣∣∣∣∣∣∣∣∣∣∣∣∣
求解
如果暴力按照上面的那条柿子来求解,时间绝对爆炸,我们需要一点小技巧,将时间优化到稳定的 O ( n 3 ) O(n^3) O(n3)。
具体的操作就是:将矩阵转化为上三角矩阵,这样我们只需要将其主对角线上的元素乘起来就好了。
具体的转化方式我们可以参照高斯消元法,先让每一行减去第一行乘以某个倍数,使得每一行的第一个数变成
0
0
0,然后让第二行对下面的行做同样的事情,让他们的第二列变成
0
0
0,以此类推即可(如果看不懂,建议先学高斯消元 不对,你连高斯消元都不会学个毛线行列式??)。
根据性质 5 5 5,我们这样消元是不会导致这个矩阵的行列式改变的。
当然,这样会面临一个问题,有些元素会变成小数,而在很多题目中我们并不能接受小数。
于是接下来用到高端的辗转相除法来帮助消元,比如说现在处理到第 i i i 行,要用这一行的第 i i i 个元素消去第 j j j 行的第 i i i 个元素,我们分别记为 A , B A,B A,B,原本的操作是 B B B 减去 A × B A A \times \frac B A A×AB,现在改一下,像辗转相除一样,使他们变为 A , B m o d A A,B \bmod A A,BmodA,具体也就是让 B B B 减去 ⌊ B A ⌋ × A \lfloor \frac B A \rfloor \times A ⌊AB⌋×A,然后交换 i , j i,j i,j 两行,重复这个操作,直到有一个变成了 0 0 0。
代码如下:
int det(int l)
{
int ans=1,fu=1;
for(int i=1;i<=l;i++)
{
for(int j=i+1;j<=l;j++)
while(f[j][i])
{
int p=f[i][i]/f[j][i];
for(int k=i;k<=l;k++)
f[i][k]=(1ll*f[i][k]-1ll*p*f[j][k]%mod+mod)%mod;
swap(f[i],f[j]);
fu=-fu;//每次交换两行之后行列式的值变为相反数
}
if(!f[i][i])return 0;
ans=1ll*ans*f[i][i]%mod;//将对角线乘起来
}
ans=(1ll*ans*fu+mod)%mod;
return ans;
}