MnZn求助高斯消元
查看原帖
MnZn求助高斯消元
34225
bulijoijiodibuliduo楼主2022/10/13 10:28

为啥这题一轮交换完不break会只因。

还有我在高斯消元前加了一个shuffle也会只因。

是数据有问题还是我有问题?

#include<bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for(auto i = (a); i <= (b); i++)
#define per(i, a, b) for(auto i = (a); i >= (b); i--)
#define size(a) ((int)(a).size())
#define pb push_back
using vi = vector<int>;

mt19937 rnd(random_device{}());
const int N = 2010;
bitset<N> a[N];
int n;

void gauss() {
  // 这里加shuffle会只因
  // shuffle(a + 1, a + 1 + n, rnd);
  rep(i, 1, n) {
    rep(j, i, n) if(a[j][i]) {
      swap(a[i], a[j]);
      // 这里不break会只因
      break;
    }
    rep(j, 1, n) if(i != j && a[j][i]) a[j] ^= a[i];
  }
  rep(i, 1, n) if(!a[i][i] && a[i][n + 1]) {
    printf("Impossible\n");
    return;
  }
  vi v;
  rep(i, 1, n) if(a[i][i] && a[i][n + 1]) v.pb(i);
  printf("%d\n", size(v));
  for(int x: v) printf("%d ", x);
}

int main() {
  scanf("%d", &n);
  rep(i, 1, n) {
    int k;
    scanf("%d", &k);
    rep(j, 1, k) {
      int x;
      scanf("%d", &x);
      a[i][x] = 1;
    }
    if(k & 1) {
      a[i][n + 1] = a[i][i] = 1;
    }
  }
  gauss();
}
2022/10/13 10:28
加载中...