矩阵行列式
定义与形式
给定一个大小为
其中的
一些性质
对于矩阵
-
以主对角线为对称轴翻转之后的行列式和
的行列式相同。更加形象的说,就是把所有下标的两维坐标翻转一下,从
变为 。根据这条性质,在之后的描述中我们认为,矩阵
中行具有的性质列也具有(有时候省略的列的读者可自行推导)。 -
矩阵的行或列具有线性性
- 乘法情况:即
的某一行或某一列乘上 之后的行列式等于 。 - 加法情况:即
的行列式可以拆成两个矩阵的加和:两个矩阵的第 行进行逐位加和之后,等于 的第 行,两矩阵的其他行和 相同。
- 乘法情况:即
-
交换其任意两行或者任意两列之后,行列式的值乘上了
。证明:交换列会使得逆序对数的奇偶改变。再由性质
,交换行和交换列等价。 -
有相同两行或两列的矩阵行列式为
。证明:
。 -
把
的第 行乘以 的结果,加到第 行上,行列式结果不变( )。根据行的线性性,我们可以把结果拆成两个矩阵结果的加和:
- 原矩阵
- 第
行等于原来的第 行乘 ,其他行不变的矩阵 。
其中第
个矩阵根据线性性可以把第 行中的 提取出来。这时根据性质 可得 。 - 原矩阵
-
上三角矩阵的行列式即为对角线元素乘积。
证明:考虑如果
不是一个形如 的排列,那么必定存在一个位置满足 ,而这会使得贡献为 。
求解方法
有了第
代码
#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); ++i)
#define FR(i, a, b) for(int i = (a); i >= (b); --i)
using namespace std;
typedef long long ll;
constexpr int N = 610;
int mod;
namespace Linear{
int det(int n, int a[][N]){
int ret = 1;
FL(i, 1, n){
FL(j, i + 1, n){
while(a[i][i]){
ll t = a[j][i] / a[i][i];
FL(k, i, n) a[j][k] = (a[j][k] + mod - t * a[i][k] % mod) % mod;
swap(a[i], a[j]), ret = -ret;
}
swap(a[i], a[j]), ret = -ret;
}
}
FL(i, 1, n) ret = (ll)ret * a[i][i] % mod;
return (ret % mod + mod) % mod;
}
}
int n, a[N][N];
int main(){
scanf("%d%d", &n, &mod);
FL(i, 1, n) FL(j, 1, n) scanf("%d", &a[i][j]);
printf("%d\n", Linear::det(n, a));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现