2068 - 行列式
给你一个n*n的行列式,求行列式的值。
Input
多组数据,输入到文件末尾结束。
每组数据先输入一个n,然后输入n行,每行n个数字(1<=n<=9),数据保证每个数字的绝对值都不会超过10。
Output
对应每组输入,输出行列式的值。
Examples
Input
1 2 2 -1 2 2 -1 3 1 2 3 2 3 1 3 2 1
Output
2 -3 -12
Hint
2nd case: (-1)*(-1) - (2)*(2)=-3
3rd case: 1*3*1 + 2*1*3 + 2*2*3 - 3*3*3 - 2*2*1 - 1*2 *1 = -12
Solution C++
#include<stdio.h> #include<string.h> int n; int s[10][10]; int main() { // freopen("1.txt","r",stdin); // freopen("2.txt","w",stdout); while(~scanf("%d",&n)) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&s[i][j]); long long mul=1; for(int i=0;i<n;i++) { if(s[i][i]==0) { int tag=1; for(int j=i+1;j<n;j++) { if(s[j][i]!=0) { for(int k=0;k<n;k++) { int t=s[i][k]; s[i][k]=s[j][k]; s[j][k]=t; } tag=0; break; } } if(tag) continue; mul*=-1;//½»»»Á½ÐÐ,·ûºÅ±äºÅ } for(int j=i+1;j<n;j++) { if(s[j][i]!=0) { long long Lcm=s[i][i]*s[j][i]; long long a=Lcm/s[i][i]; long long b=Lcm/s[j][i]; mul*=b; for(int k=0;k<n;k++) // | k*aij | == k*| aij | { s[j][k]*=b; } for(int k=i;k<n;k++) { s[j][k]-=s[i][k]*a; } } } /* for(int ii=0;ii<n;ii++) { for(int jj=0;jj<n;jj++) { printf("%d ",s[ii][jj]); }printf("\n"); }*/ } long long ans=1; for(int i=0;i<n;i++) ans*=s[i][i]; printf("%lld\n",ans/mul); } }
Hint
2nd case: (-1)*(-1) - (2)*(2)=-3
3rd case: 1*3*1 + 2*1*3 + 2*2*3 - 3*3*3 - 2*2*1 - 1*2 *1 = -12