游客 Signup | Login
中文 | En

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

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题