#include <iostream>
using namespace std;
const int MAXN = 1010;
int n, p;
int A[MAXN][MAXN];
int inverse(int a, int m) {
int m0 = m, t, q;
int x0 = 0, x1 = 1;
if (m == 1) return 0;
while (a > 1) {
q = a / m;
t = m;
m = a % m;
a = t;
t = x0;
x0 = x1 - q * x0;
x1 = t;
}
if (x1 < 0) x1 += m0;
return x1;
}
int detmod(int A[MAXN][MAXN], int n, int p) {
int det = 1;
for (int i = 0; i < n; ++i) {
int maxn = i;
for (int j = i + 1; j < n; ++j) {
if (A[j][i] > A[maxn][i]) {
maxn = j;
}
}
if (maxn != i) {
for (int k = i; k < n; ++k) {
swap(A[i][k], A[maxn][k]);
}
det = (det * -1) % p;
}
if (A[i][i] == 0) return 0;
for (int j = i + 1; j < n; ++j) {
int ratio = (A[j][i] * inverse(A[i][i], p)) % p;
for (int k = i; k < n; ++k) {
A[j][k] = (A[j][k] - (ratio * A[i][k]) % p + p) % p;
}
}
det = (det * A[i][i]) % p;
}
if (det < 0) det += p;
return det;
}
int main() {
cin >> n >> p;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> A[i][j];
}
}
int result = detmod(A, n, p);
cout << result ;
return 0;
}
拓展欧几里得