12pts求助#1WA其他RE
查看原帖
12pts求助#1WA其他RE
586689
K1ondra楼主2024/7/11 11:35
#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;
}

拓展欧几里得

2024/7/11 11:35
加载中...