行列式求值


推荐了解:

矩阵求逆

高斯消元

行列式求值

P7112 【模板】行列式求值

对于一个 $n$ 阶的方阵 $A$,它的 $|A|$ 是行列式 $|A|$ 的值。

通过后面说的运算方式和求值的方式,我们将矩阵消成上三角形式然后求值。交换行的时候注意正负号,计算的时候注意精度。

行列式基本运算

  • 加法(减法):
  • 乘法:
  • 一行加上另外一行的倍数:
  • 交换行:

求值公式

  • 对角
  • 上三角(可以“无伤”消掉多余部分)
  • 下三角(可以“无伤”消掉多余部分)
  • 副对角

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<vector>
#include<random>
#include<ctime>
using namespace std;
long long r_r(){//快读 
  long long k=0,f=1;
  char c=getchar();
  while(!isdigit(c)){
    if(c=='-')f=-1;
    c=getchar();
  }
  while(isdigit(c)){
    k=(k<<1)+(k<<3)+(c^48);
    c=getchar();
  }
  return k*f;
} 
const int o_o=610;
int n,a_a[o_o][o_o],m_d;
int f_i(){
  int a_s=1,f_h=1;
  for(int i=1;i<=n;i++){//枚举行 
    for(int j=i+1;j<=n;j++){//枚举每回处理的行 
        while(a_a[i][i]){
            int d_i=a_a[j][i]/a_a[i][i];//消项 
            for(int k=i;k<=n;k++)//更新每回处理的行 
                a_a[j][k]=(a_a[j][k]-1ll*d_i*a_a[i][k]%m_d+m_d)%m_d;
            swap(a_a[i],a_a[j]);//交换行 
        f_h=-f_h;//行列式变号 
        } 
        swap(a_a[i],a_a[j]);//交换行 
      f_h=-f_h;//行列式变行 
    }
  }
  for(int i=1;i<=n;i++)a_s=1ll*a_a[i][i]*a_s%m_d;//统计答案 
  a_s=1ll*f_h*a_s;//处理正负 
  return (a_s+m_d)%m_d;//输出 
}
int main(){
  n=r_r();//矩阵大小 
  m_d=r_r();//读入模数 
  
  //读入矩阵 
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)a_a[i][j]=r_r();
  printf("%d\n",f_i());//结果 
  return 0;
}

文章作者: 王大神——A001
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王大神——A001 !
  目录