计算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;
}