#include #include #include using u64 = unsigned long long int; using vec = std::bitset<40000>; using bvec = std::pair; int n, m; std::vector basis; void add_to_basis(vec& x){ for(auto const &b: basis) if(x.test(b.second)) x ^= b.first; if(x.any()){ basis.emplace_back(x, x._Find_first()); /* for(int i = 0; i < 40000; i++){ if(x.test(i)){ basis.emplace_back(x, i); return; } } */ } } bool is_spanned(const vec& x){ vec y(x); for(auto const &b: basis){ if(y.test(b.second)) y ^= b.first; } return y.none(); } int main(){ scanf("%d%d", &n, &m); for(int i = 0; i < n; i++){ vec x, y; for(int j = 0; j < n; j++){ x.set(n * i + j); y.set(n * j + i); } add_to_basis(x); add_to_basis(y); } for(int i = 0; i < 2*n-1; i++){ vec x, y; for(int j = std::max(0, i-n+1); j <= std::min(i, n-1); j++){ x.set(n * j + i-j); } for(int j = std::max(0, n-1-i); j <= std::min(2*n-2-i, n-1); j++){ y.set(n * j + i+j-n+1); } add_to_basis(x); add_to_basis(y); } std::vector q; for(int i = 0; i < m; i++){ vec x; for(int j = 0; j < n; j++){ for(int k = 0; k < n; k++){ char c; do { c = getchar(); } while(c != '.' && c != '#'); if(c == '#') x.set(n * j + k); } } q.push_back(x); } for(int i = 0; i < m-1; i++){ for(int j = i+1; j < m; j++){ printf("%d", is_spanned(q[i] ^ q[j])); } puts(""); } return 0; }