Find The Determinant III SPOJ

来源:互联网 发布:惠州网络车问政平台 编辑:程序博客网 时间:2024/06/04 19:56

计算n阶矩阵行列式的值

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>#include <vector>using namespace std;long long a[201][201];long long det(long long a[][201], int n, int p){    long long ans = 1;    for (int i = 0; i < n; i++)    {        if (!a[i][i])        {            bool flag = false;            for (int j = i + 1; j < n; j++)                if (a[j][i])                {                    flag = true;                    for (int k = i; k < n; k++)                        swap(a[i][k], a[j][k]);                    ans = -ans;                    break;                }            if (!flag)                return 0;        }        for (int j = i + 1; j < n; j++)            while (a[j][i])            {                long long t = a[i][i] / a[j][i];                for (int k = i; k < n; k++)                {                    a[i][k] = (a[i][k] - t * a[j][k]) % p;                    swap(a[i][k], a[j][k]);                }                ans = -ans;            }        ans = (ans * a[i][i]) % p;    }    return ans + p;}int main(){    int n, p;    while (~scanf("%d %d", &n, &p))    {        for (int i = 0; i < n; i++)            for (int j = 0; j < n; j++)            {                scanf("%lld", &a[i][j]);                a[i][j] %= p;            }        printf("%lld\n", det(a, n, p) % p);    }    return 0;}