行列式求值法则:传送门
行列式求值,说白了就是用高斯消元把行列式消成上三角或者下三角(这里选择消成上三角,其实都一样),用到的就是行列式求值的几条性质,我这里是用了一个变量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表示被坑了