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
AC × 55
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