#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). 做法: 计算矩阵核 暴力张一下线性空间 背包