【洛谷团队题目】

题目描述

给你一个N(n10)阶行列式,请计算出它的值

输入输出格式

输入格式:

第一行有一个整数n
在以下n行中,每行有n个整数,表示该行列式

输出格式:

这个行列式的值

输入输出样例

输入样例#1: 
8
2 10 4 4 3 6 10 6
1 10 9 3 2 1 6 7
3 9 8 7 1 1 8 7
2 10 8 6 9 9 3 4
1 7 1 8 2 6 2 3
9 2 4 8 10 6 10 3
3 6 7 9 8 2 8 1
2 9 2 1 10 7 4 5
输出样例#1:
-135742
输入样例#2: 
4
1 2 3 4
1 3 4 1
1 4 1 2
1 1 2 3

输出样例#2: 

16
无敌水的板子
主要用到了高斯消元的知识(但略有不同)
不会的可以看看上一篇博文
直接来代码QAQ
#include<bits/stdc++.h>
using namespace std;
double n, a[20][20], ans = 1;
int sum;
inline void qwq(int x, int y, double k) 
{
    for (int i = 1; i <= n; ++i)
        a[y][i] -= (double)(k * a[x][i]);
}
inline void qaq(int x, int y)
{
    for (int i = 1; i <= n; ++i)
        swap(a[i][x], a[i][y]);
}
inline double QAQ(int x, double k) 
{
    for (int i = 1; i <= n; ++i)
        a[x][i] /= k;
    return k;
}
int main()
{
    scanf("%lf", &n);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            scanf("%lf", &a[i][j]);
    for (int i = 1; i < n; ++i)
    {   
        sum=i;
        while (a[i][i] == 0 && sum<=n) 
        {
            qaq(i, sum + 1); 
            ans *= -1;
            sum++;
        }
        ans *= QAQ(i, a[i][i]);
        for (int j = i + 1; j <= n; ++j)
            qwq(i, j, a[j][i]);
    }
    for (int i = 1; i <= n; ++i)
        ans *= a[i][i];
    printf("%0.0lf", ans);
    return 0;
}

ok,非常漂亮

猜你喜欢

转载自www.cnblogs.com/gongcheng456/p/10705288.html