Submission #173446
Source Code Expand
#include <iostream> #include <vector> #include <algorithm> using namespace std; //================================== // matricies on F2 //================================== struct matrix_f2 { typedef unsigned long long bits; vector<vector<bits> > data; const int bits_size; int row, col, array_size; static bits bit(const int p) { return 1ULL << p; } static matrix_f2 ident (const int d) { matrix_f2 id(d); for (int i = 0; i < d; ++i) { id.set_at(i, i, 1); } return id; } matrix_f2 (const int n): bits_size(sizeof(bits) * 8), row(n), col(n), array_size((col + bits_size - 1) / bits_size) { data = vector<vector<bits> >(row, vector<bits>(col, 0)); } matrix_f2 (const int r, const int c) : bits_size(sizeof(bits) * 8), row(r), col(c), array_size((col + bits_size - 1) / bits_size) { data = vector<vector<bits> >(row, vector<bits>(col, 0)); } matrix_f2 (const matrix_f2& orig): data(orig.data), bits_size(orig.bits_size), row(orig.row), col(orig.col), array_size(orig.array_size) { } int get_at (const int i, const int j) const { return (data[i][j / bits_size] >> (j % bits_size)) & 1; } void set_at(const int i, const int j, const int v) { int array_pos = j / bits_size; int bit_pos = j - array_pos * bits_size; if (v) { data[i][array_pos] |= bit(bit_pos); } else { data[i][array_pos] &= ~(bit(bit_pos)); } return; } matrix_f2 trans() const { matrix_f2 ret(col, row); for (int i = 0; i < ret.row; ++i) { for (int j = 0; j < ret.col; ++j) { ret.set_at(i, j, get_at(j, i)); } } return ret; } matrix_f2 operator+(const matrix_f2& op) const { if (op.row != row || op.col != col) { cerr << "matrix_f2::operator+ : dimension error."; return matrix_f2(0); } matrix_f2 ret(row, col); for (int i = 0; i < row; ++i) { for (int j = 0; j < array_size; ++j) { ret.data[i][j] = data[i][j] ^ op.data[i][j]; } } return ret; } matrix_f2 operator*(const matrix_f2& op) const { if (col != op.row) { cerr << "matrix_f2::operator* : dimension error."; return matrix_f2(0); } matrix_f2 ret(row, op.col), opt = op.trans(); for (int i = 0; i < ret.row; ++i) { for (int j = 0; j < ret.col; ++j) { int v = 0; for (int k = 0; k < array_size; ++k) { v ^= __builtin_parityll(data[i][k] & opt.data[j][k]); } ret.set_at(i, j, v); } } return ret; } matrix_f2 operator^(const int n) const { if (n == 1) return matrix_f2(*this); if (n == 0) return ident(row); matrix_f2 sqr = *this ^ (n / 2); matrix_f2 ret = sqr * sqr; return n % 2 ? ret * (*this) : ret; } void append_vector (const vector<int>& v) { if (row != v.size()) { cerr << "matrix_f2::append_vector : dimension error."; return; } const int array_pos = col / bits_size; const int bit_pos = col - array_pos * bits_size; if (bit_pos == 0) { for (int i = 0; i < row; ++i) { data[i].push_back(0); } ++array_size; } ++col; for (int i = 0; i < row; ++i) { if (v[i]) { data[i][array_pos] |= bit(bit_pos); } } return; } int gauss_jordan () { int dim = 0; for (int c = 0; c < col; ++c) { int r = dim; for (; r < row; ++r) { if (get_at(r, c)) break; } if (r == row) continue; swap(data[dim], data[r]); for (int r = 0; r < row; ++r) { if (r == dim) continue; if (get_at(r, c)) { for (int i = 0; i < array_size; ++i) { data[r][i] ^= data[dim][i]; } } } ++dim; } return dim; } void print() { for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { cout << get_at(i, j) << ' '; } cerr << endl; } return; } }; int main() { int n; cin >> n; matrix_f2 a(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { int c; cin >> c; a.set_at(i, j, c); } } vector<int> v(n); for (int i = 0; i < n; ++i) { cin >> v[i]; } int t; cin >> t; matrix_f2 m = a ^ t; matrix_f2 ext = m; ext.append_vector(v); int rank_m = m.gauss_jordan(); int rank_ext = ext.gauss_jordan(); if (rank_m != rank_ext) { cout << "none" << endl; } else if (rank_m == n) { for (int i = 0; i < n; ++i) { cout << ext.get_at(i, n); if (i == n-1) { cout << endl; } else { cout << ' '; } } } else { cout << "ambiguous" << endl; } return 0; }
Submission Info
Submission Time | |
---|---|
Task | F - Graph Automata Player |
User | amylase |
Language | C++ (GCC 4.4.7) |
Score | 100 |
Code Size | 5614 Byte |
Status | AC |
Exec Time | 316 ms |
Memory | 5192 KB |
Judge Result
Set Name | all | ||
---|---|---|---|
Score / Max Score | 100 / 100 | ||
Status |
|
Set Name | Test Cases |
---|---|
all | 00_sample_00, 00_sample_01, 00_sample_02, 01_minimal_00, 01_minimal_01, 01_minimal_02, 01_minimal_03, 01_minimal_04, 01_minimal_05, 01_minimal_06, 02_triangle_00, 02_triangle_01, 02_triangle_02, 02_triangle_03, 02_triangle_04, 10_random_00, 10_random_01, 10_random_02, 10_random_03, 10_random_04, 10_random_05, 10_random_06, 10_random_07, 10_random_08, 10_random_09, 10_random_10, 10_random_11, 10_random_12, 10_random_13, 10_random_14, 10_random_15, 10_random_16, 10_random_17, 10_random_18, 10_random_19, 10_random_20, 10_random_21, 10_random_22, 10_random_23, 10_random_24, 10_random_25, 10_random_26, 10_random_27, 10_random_28, 10_random_29, 20_maximum_00, 20_maximum_01, 20_maximum_02, 20_maximum_03, 20_maximum_04, 20_maximum_05, 20_maximum_06, 20_maximum_07, 20_maximum_08, 20_maximum_09 |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
00_sample_00 | AC | 39 ms | 864 KB |
00_sample_01 | AC | 24 ms | 912 KB |
00_sample_02 | AC | 23 ms | 964 KB |
01_minimal_00 | AC | 23 ms | 916 KB |
01_minimal_01 | AC | 23 ms | 816 KB |
01_minimal_02 | AC | 23 ms | 920 KB |
01_minimal_03 | AC | 23 ms | 912 KB |
01_minimal_04 | AC | 22 ms | 816 KB |
01_minimal_05 | AC | 23 ms | 816 KB |
01_minimal_06 | AC | 23 ms | 912 KB |
02_triangle_00 | AC | 24 ms | 916 KB |
02_triangle_01 | AC | 23 ms | 816 KB |
02_triangle_02 | AC | 21 ms | 912 KB |
02_triangle_03 | AC | 23 ms | 812 KB |
02_triangle_04 | AC | 22 ms | 908 KB |
10_random_00 | AC | 39 ms | 1208 KB |
10_random_01 | AC | 164 ms | 3520 KB |
10_random_02 | AC | 149 ms | 3316 KB |
10_random_03 | AC | 76 ms | 2008 KB |
10_random_04 | AC | 116 ms | 2552 KB |
10_random_05 | AC | 174 ms | 3784 KB |
10_random_06 | AC | 26 ms | 972 KB |
10_random_07 | AC | 167 ms | 3600 KB |
10_random_08 | AC | 73 ms | 1860 KB |
10_random_09 | AC | 47 ms | 1592 KB |
10_random_10 | AC | 26 ms | 1024 KB |
10_random_11 | AC | 27 ms | 932 KB |
10_random_12 | AC | 215 ms | 3896 KB |
10_random_13 | AC | 22 ms | 908 KB |
10_random_14 | AC | 136 ms | 2876 KB |
10_random_15 | AC | 134 ms | 2872 KB |
10_random_16 | AC | 34 ms | 1060 KB |
10_random_17 | AC | 161 ms | 3712 KB |
10_random_18 | AC | 32 ms | 1060 KB |
10_random_19 | AC | 137 ms | 3244 KB |
10_random_20 | AC | 177 ms | 3848 KB |
10_random_21 | AC | 28 ms | 992 KB |
10_random_22 | AC | 181 ms | 3532 KB |
10_random_23 | AC | 24 ms | 912 KB |
10_random_24 | AC | 243 ms | 4516 KB |
10_random_25 | AC | 92 ms | 2264 KB |
10_random_26 | AC | 135 ms | 2816 KB |
10_random_27 | AC | 33 ms | 1216 KB |
10_random_28 | AC | 31 ms | 996 KB |
10_random_29 | AC | 96 ms | 2132 KB |
20_maximum_00 | AC | 279 ms | 5148 KB |
20_maximum_01 | AC | 290 ms | 5144 KB |
20_maximum_02 | AC | 316 ms | 5156 KB |
20_maximum_03 | AC | 282 ms | 5160 KB |
20_maximum_04 | AC | 268 ms | 5172 KB |
20_maximum_05 | AC | 286 ms | 5172 KB |
20_maximum_06 | AC | 272 ms | 5192 KB |
20_maximum_07 | AC | 295 ms | 5152 KB |
20_maximum_08 | AC | 268 ms | 5144 KB |
20_maximum_09 | AC | 276 ms | 5168 KB |