Unaccepted 求助 全部 WA (不符合题面要求)
查看原帖
Unaccepted 求助 全部 WA (不符合题面要求)
360265
Galois_Field_1048576楼主2023/7/14 20:15
#include <bits/stdc++.h>
using namespace std;

#ifdef ONLINE_JUDGE
const int n = 100;
#else
const int n = 100;
#endif

using V = bitset<n * 2>;
using M = vector<V>;

ostream& operator<<(ostream& os, M A) {
    for (int i = 0; i < n; ++ i) {
        for (int j = 0; j < n; ++ j) cout << A[i][j] << " ";
        cout << endl;
    }
    return os;
}

M Gauss(M A) {
    for (int i = 0; i < n; ++i) A[i][i + n] = 1;
    for (int i = 0; i < n; ++i) {
        int one = -1;
        for (int j = 0; j < n; ++j)
            if (A[j][i]) one = j;
        if (one == -1) continue;
        swap(A[one], A[i]);
        for (int j = 0; j < n; ++j)
            if (j != i && A[j][i]) A[j] ^= A[i];
    }
    return A;
}

M ker(M A) {
    A = Gauss(A);
    M ans;
    for (int i = 0; i < n; ++i) {
        bool flag = 1;
        V v(0);
        for (int j = 0; j < n; ++j)
            if (A[i][j] == 1) flag = 0;
        for (int j = 0; j < n; ++j) v[j] = A[i][j + n];
        if (flag) ans.push_back(v);
    }
    return ans;
}
V max(V a, V b) {
    for (int i = n - 1; i >= 0; --i) {
        if (a[i] != b[i])
            if (a[i] > b[i])
                return a;
            else
                return b;
    }
    return a;
}
M Ap[n], A(n), ans;

M span(M S) {
    M ans;
    int n = S.size();
    for (int k = 0; k < (1 << n); ++ k) {
        V ths(0);
        for (int i = 0; i < n; ++ i)
            if (k & (1 << i)) ths ^= (S[i]);
        ans.push_back(ths);
    }
    return ans;
}

pair<vector<int>, bool> pack(vector<int> *value, int tg) {
    bool f[n+1][n*n+1] = {};
    f[0][0] = 1;
    for (int i = 0; i < n; ++ i) {
        for (int j = 0; j <= tg; ++ j) {
            for (int k : value[i]) {
                if (j + k <= tg) {
                    if (!f[i + 1][j + k] && f[i][j]) {
                    }
                    f[i + 1][j + k] = f[i + 1][j + k] || f[i][j];
                }
            }
        }
    }
    if (!f[n][tg]) return {vector<int>(), 0};
    else {
        vector<int> ans;
        int nowa = n, nowb = tg;
        for (int k = n - 1; k >= 0; -- k) {
            for (int pp = 0; pp < value[k].size(); ++ pp) {
                if (f[k][nowb - value[k][pp]]) {
                    ans.push_back(pp);
                    nowa = k;
                    nowb -= value[k][pp];
                    break;
                }
            }
        }
        reverse(ans.begin(), ans.end());
        return {ans, 1};
    }
}
vector<int> to_input[n * 2];
int main() {
    int m, k;
    cin >> m >> k;
    M A(n);
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j) {
            int x;
            cin >> x;
            A[i][j] = x;
        }
    for (int i = 0; i < n; ++i) Ap[i] = A;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) Ap[i][j][j] = A[i][j] ^ Ap[i][j][j];
    }
    for (int i = 0; i < n; ++i) {
        Ap[i] = ker(Ap[i]); 
        reverse(Ap[i].begin(), Ap[i].end());
        while (Ap[i].size() > 0 && Ap[i][Ap[i].size() - 1] == V(0)) Ap[i].pop_back();
        Ap[i] = span(Ap[i]);
        for (auto k : Ap[i])
            to_input[i].push_back(k.count());
    }
    auto g = pack(to_input, k);
    if (not g.second) {
        cout << -1 << endl; return 0;
    } else {
        cout << 1 << endl;
    }
    M ans;
    for (int i = 0; i < n; ++ i) {
        ans.push_back(Ap[i][g.first[i]]); 
    }
    cout << ans; 
}

全部 WA (对应乘积不等于普通乘积, invalid matrix). 做法: 计算矩阵核 暴力张一下线性空间 背包

2023/7/14 20:15
加载中...