行列式求解

行列式

给出一个矩阵求 行列式。

输入:

1

3

1 -2 -1

0 3 2

3 1 -1

思路:

不能直接乘上上面行的倍数来消除本行对应元素。试试辗转相减法把。

(1,3)减去2倍(0,1)->(1,0)

(5,3)减去0倍(3,5)减去1倍(2,3)减去1倍(1,2)减去2倍(0,1)->(1,0)

然后每次检查上面行的元素是否为0,然后换回来就行了

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int mod=0x1f1f1f1f;
typedef long long ll;
ll t,n,a[10][10];
ll solve(){//计算行列式,化简成下三角型(有点类似辗转相除法)
	ll res=1,w=1;//res是结果,w是符号
	for(int i=1;i<=n;i++){//对[i][i]元素所在的列处理
		for(int j=i+1;j<=n;j++){
//我们每次都让下面的行减去上面行的a[j][i]/a[i][i]倍,然后再让最小的行放到上面判断是不是[i][i]是不是0,如果不是就继续。
			while(a[i][i]){
				ll di=a[j][i]/a[i][i];
				for(int k=i;k<=n;k++){
					a[j][k]=(a[j][k]-di*a[i][k]%mod+mod)%mod;//有负数的话要加一次mod
				}
				swap(a[i],a[j]);
				w=-w;
			}
			swap(a[i],a[j]);
			w=-w;
		}
	}
		for(int i=1;i<=n;i++)
			res=a[i][i]*res%mod;
		res=w*res;
		return (res+mod)%mod;	
}

int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			cin>>a[i][j];
		cout<<solve()<<'\n';
	}	
}
相关推荐
流年如夢14 分钟前
单链表的应用 --> 简单通讯录的实现
android·数据结构·链表
xh didida1 小时前
算法 -- 位运算
开发语言·c++·算法
祁_z2 小时前
大模型轻量化:模型格式选型(ONNX/GGUF/TFLite) + 压缩三剑客(量化/剪枝/蒸馏)+ 大模型推理执行流程介绍
算法·机器学习·剪枝·量化·蒸馏·大模型轻量化
绛橘色的日落(。・∀・)ノ2 小时前
机器学习之手写数字识别
算法
流年如夢2 小时前
单链表Ⅲ(LeetCode)
数据结构·算法·leetcode·职场和发展
鉴生Eric2 小时前
FOR算法中的AI智能体具体如何实现频谱感知和动态信道选择?请用技术术语详细说明其决策流程
人工智能·算法
量子炒饭大师2 小时前
【优化算法】双指针算法的「义体化」重构 ——【双指针】双指针算法中的指针是如何定义的?如何使用它进行一些简单的算法?
c++·算法·重构·优化算法·双指针
通信小呆呆2 小时前
ZC序列符号同步:多径信道下的四种经典算法
算法
机器学习之心HML2 小时前
粒子群算法求解速冻食品冷链配送路径优化问题,MATLAB代码
算法·matlab·冷链配送路径优化
fie88892 小时前
基于粒子群优化(PSO)算法的带STATCOM的IEEE 30节点系统最优潮流MATLAB实现
开发语言·算法·matlab