aoj-2624.cpp

#include "../include/math/lup_decomposition.cpp"

#define REP(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

struct Bool {
  int n;
  Bool() : n(0) { ; }
  Bool(int m) : n(m & 1) { ; }
  explicit operator int() const { return n; }
  explicit operator ll() const { return n; }
  bool operator==(const Bool &a) const { return n == a.n; }
  Bool &operator+=(const Bool &a) {
    n ^= a.n;
    return *this;
  }
  Bool &operator-=(const Bool &a) {
    n ^= a.n;
    return *this;
  }
  Bool &operator*=(const Bool &a) {
    n &= a.n;
    return *this;
  }
  Bool operator+(const Bool &a) const { return n ^ a.n; }
  Bool operator-(const Bool &a) const { return n ^ a.n; }
  Bool operator*(const Bool &a) const { return n & a.n; }
  Bool operator^(const int &) const { return *this; }
  Bool operator/(const Bool &) const { return *this; }
  Bool &operator/=(const Bool &) { return *this; }
};

bool is_zero(Bool x) { return int(x) == 0; }
int abs(Bool x) { return int(x); }

int main() {
  int N, T;
  cin >> N;
  Matrix<Bool> mat(N, N, 0);
  Vec<Bool> ary(N);
  REP(i, N) REP(j, N) {
    int in;
    cin >> in;
    mat[i][j] = Bool(in);
  }
  REP(i, N) {
    int in;
    cin >> in;
    ary[i] = Bool(in);
  }
  cin >> T;
  mat = mat ^ T;
  int rank1 = mat.rank();
  if (rank1 < N) {
    REP(i, N) mat[i].push_back(ary[i]);
    int rank2 = mat.rank();
    if (rank1 == rank2)
      cout << "ambiguous" << endl;
    else
      cout << "none" << endl;
    return 0;
  }
  auto lup = LUPDecomposition(mat);
  Vec<Bool> res = LUPBackSubstitution(lup, ary);
  REP(i, res.size()) {
    if (i > 0) cout << " ";
    cout << int(res[i]);
  }
  cout << endl;
  return 0;
}

Includes

Back