题意:求矩阵的行列式模p.
这样的情况下就不能用高精度消元搞了,可以在消去的时候用辗转相除避免精度误
差.然后根据行列式的性质,矩阵的元素可以直接模p.
板子题,最终的结果要是正数.
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> #include <queue> using namespace std; #define maxn 333 #define eps 1e-10 long long a[maxn][maxn]; long long n, mod; long long det () //按列化为下三角 { long long res = 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]); } res = -res; 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]) % mod; swap (a[i][k], a[j][k]); } res = -res; } } res *= a[i][i]; res %= mod; } return (res+mod)%mod; } int main() { //freopen("in.txt", "r", stdin); while (cin >> n >> mod) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cin >> a[i][j], a[i][j] %= mod; } cout << det () << "\n"; } return 0; }