zoukankan      html  css  js  c++  java
  • 行列式求值

    行列式求值法则:传送门

    行列式求值,说白了就是用高斯消元把行列式消成上三角或者下三角(这里选择消成上三角,其实都一样),用到的就是行列式求值的几条性质,我这里是用了一个变量reo来记录行列式的值

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<cstdlib>
     7 using namespace std;
     8 typedef long long ll;
     9 typedef long double ld;
    10 typedef pair<int,int> pr;
    11 const double pi=acos(-1);
    12 #define rep(i,a,n) for(int i=a;i<=n;i++)
    13 #define per(i,n,a) for(int i=n;i>=a;i--)
    14 #define Rep(i,u) for(int i=head[u];i;i=Next[i])
    15 #define clr(a) memset(a,0,sizeof a)
    16 #define pb push_back
    17 #define mp make_pair
    18 #define fi first
    19 #define sc second
    20 ld eps=1e-9;
    21 ll pp=1000000007;
    22 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
    23 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
    24 ll read(){
    25     ll ans=0;
    26     char last=' ',ch=getchar();
    27     while(ch<'0' || ch>'9')last=ch,ch=getchar();
    28     while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    29     if(last=='-')ans=-ans;
    30     return ans;
    31 }
    32 //head
    33 double reo=1;
    34 ll n,m;
    35 double a[100][100];
    36 
    37 bool check(ll k){
    38     if(fabs(a[k][n+1])<eps)return 1;
    39     rep(i,1,n)
    40         if(fabs(a[k][i])>eps)return 1;
    41     return 0;
    42 }
    43 int main(){
    44     
    45     n=read();m=n;
    46     
    47     rep(i,1,m)
    48         rep(j,1,n)a[i][j]=read();
    49     
    50     ll flag=0;
    51     rep(i,1,n){
    52         ll t=i;
    53         while(a[t][i]==0 && t<=n)t+=1;
    54         if(t==n+1){
    55             flag=1;
    56             continue;
    57         }
    58         rep(j,1,n)swap(a[i][j],a[t][j]);
    59         if(t!=i) reo*=-1;//交换行列式的两行,行列式取相反数
    60         double kk=a[i][i];
    61         reo*=kk;//行列式的某一行的所有元素都乘以同一数k,等于用数k乘此行列式
    62         rep(j,1,n)a[i][j]/=kk;
    63         rep(j,1,m)
    64             if(i!=j){
    65                 double kk=a[j][i];
    66                 rep(k,1,n)
    67                     a[j][k]-=kk*a[i][k];//把行列式的某一行的各元素乘以同一数然后加到另一行对应的元素上去,行列式不变
    68             }
    69     }
    70 
    71     printf("%0.0lf",reo);//
    72     
    73     
    74 }
    75  

    注意一定要用double,否则会爆精度(QwQ表示被坑了

  • 相关阅读:
    1017.陶陶装苹果
    1084.爬楼梯加强版
    1056.A ^ B Problem 快速幂算法。
    1074.我们喜欢递归的斐波那契数列
    1073.我们喜欢递归的阶乘
    1046 没过
    python 基本常用数据类型
    yii2.0 数据库查询操作
    python 随便笔记
    搭建自己的koa+mysql后台模板
  • 原文地址:https://www.cnblogs.com/lcezych/p/10704335.html
Copyright © 2011-2022 走看看