QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#674360 | #313. Equation Mod 2 | afy | RE | 1ms | 3616kb | C++20 | 3.3kb | 2024-10-25 15:24:56 | 2024-10-25 15:24:57 |
Judging History
answer
#include <bits/stdc++.h>
#ifdef LOCAL
#include "debug.h"
#else
#define deb(...)
#endif
using namespace std;
#define ll long long
// #define int long long
#define ull unsigned long long
#define pii pair<int, int>
#define db double
#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl "\n"
#define alls(x) (x).begin(), (x).end()
#define fs first
#define sec second
#define bug(x) cerr << #x << " = " << x << endl
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const double PI = acos(-1.0);
int rksz;
int gauss(vector<vector<int>>& a, int n, int m, vector<int>& solution) {
vector<int> freevar; // 记录自由变量对应的列
vector<int> pivot(n + 1, -1); // 记录每一行的主元所在的列
int r = 1;
for (int c = 1; c <= m; c++) {
int t = r;
// 找到当前列中的主元
for (int i = r; i <= n; i++) {
if (a[i][c]) {
t = i;
break;
}
}
if (!a[t][c]) {
freevar.push_back(c);
continue; // 当前列没有主元,继续到下一列
}
pivot[r] = c; // 第 r 行的主元在 c 列
if (t != r) { // 交换行,将主元行放在第 r 行
for (int i = c; i <= m + 1; i++)
swap(a[r][i], a[t][i]);
}
// 消去主元下方的所有行
for (int i = r + 1; i <= n; i++) {
if (a[i][c])
for (int j = m + 1; j >= c; j--) a[i][j] ^= a[r][j];
}
r++;
}
// 检查是否有解
for (int i = r; i <= n; i++) {
if (a[i][m + 1])
return 0; // 无解
}
// int tot = 0;
rksz = r - 1; // 这是系数矩阵的秩
// 自由变量根据题目要求情况去赋值
for (auto i : freevar) solution[i] = 0;
//------------------------------
for (int i = rksz; i >= 1; i--) {
int sum = a[i][m + 1];
for (int j = 1; j <= m; j++) {
if (j == pivot[i]) {
continue;
} // 如果不是主元所在的列
sum ^= (a[i][j] * solution[j]); // 右边已经求出来的,左边自由变量遗留
}
solution[pivot[i]] = sum; // 求解对应的主元变量
}
assert(rksz <= m);
if (rksz < m)
return 2; // 无穷多解
return 1; // 唯一解
}
// int t = gauss(b, n,m, sol);
void solve() {
int n, m;
cin >> n >> m;
vector<int> sol(n + 1);
vector b(m + 1, vector<int>(n + 2));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n + 1; j++) {
cin >> b[i][j];
}
}
int t = gauss(b, m, n, sol);
//assert(t);
for(int i=1;i<=n;i++)cout<<sol[i]<<" ";
}
signed main() {
cin.tie(0);
ios::sync_with_stdio(false);
#ifdef LOCAL
double starttime = clock();
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
int t = 1;
// cin >> t;
while (t--) solve();
#ifdef LOCAL
double endtime = clock();
cerr << "Time Used: " << (double)(endtime - starttime) / CLOCKS_PER_SEC * 1000 << " ms" << endl;
#endif
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3616kb
input:
100 95 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1...
output:
0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0
result:
ok good solution
Test #2:
score: -100
Runtime Error
input:
100 4 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 ...