#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using uint = unsigned int;
template <class T>
using V = vector<T>;
template <class T>
using VV = vector<vector<T>>;
template <class T, class U>
void chmax(T& x, U y) {
  if (x < y) x = y;
}
template <class T, class U>
void chmin(T& x, U y) {
  if (y < x) x = y;
}
template <class T>
void mkuni(V<T>& v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
}
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& vc) {
  o << "{";
  for (const T& v : vc) o << v << ",";
  o << "}";
  return o;
}
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }
void zeta(V<ll>& f, int N) {
  for (int i = 0; i < int(N); i++)
    for (int j = (1 << N) - 1; j >= 0; j--)
      if ((j >> i) & 1) f[j] += f[j ^ (1 << i)];
}
void mebius(V<ll>& g, int N) {
  for (int i = 0; i < int(N); i++)
    for (int j = (1 << N) - 1; j >= 0; j--)
      if (0 == (j & 1 << i)) g[j] -= g[j ^ (1 << i)];
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);
  int N;
  cin >> N;
  VV<int> e(N, V<int>(N));
  for (int i = 0; i < int(N); i++) {
    string s;
    cin >> s;
    for (int j = 0; j < int(N); j++)
      if (s[j] == '1') e[i][j] = 1;
  }
  V<ll> path(1 << N);
  {
    VV<ll> dp(1 << N, V<ll>(N));
    for (int s = 0; s < int(1 << N); s++) {
      for (int v = 0; v < int(N); v++)
        if (s & 1 << v) {
          if (s == (1 << v)) {
            dp[s][v] = 1;
          }
          for (int u = 0; u < int(N); u++)
            if (!(s & 1 << u) && e[v][u]) {
              dp[s | 1 << u][u] += dp[s][v];
            }
        }
    }
    for (int s = 0; s < int(1 << N); s++) {
      for (int u = 0; u < int(N); u++) path[s] += dp[s][u];
    }
  }
  VV<ll> fk(N + 1, V<ll>(1 << N));
  for (int k = 1; k <= int(N); k++) {
    for (int s = 0; s < int(1 << N); s++)
      if (__builtin_popcount(s) == k) {
        fk[k][s] = path[s];
      }
    zeta(fk[k], N);
    void(0);
  }
  map<V<int>, ll> p2val;
  {
    VV<ll> buf(N + 1, V<ll>(1 << N));
    buf[0] = V<ll>(1 << N, 1);
    function<void(V<int>, int, int)> enum_p = [&](V<int> p, int sm, int from) {
      if (sm == N) {
        ll res = 0;
        for (int s = 0; s < int(1 << N); s++) {
          if ((__builtin_popcount(s) & 1) != (N & 1))
            res -= buf[N][s];
          else
            res += buf[N][s];
        }
        p2val[p] = res;
        return;
      }
      for (int i = from; i <= N - sm; i++) {
        V<int> np = p;
        np.emplace_back(i);
        for (int s = 0; s < int(1 << N); s++)
          buf[sm + i][s] = buf[sm][s] * fk[i][s];
        enum_p(np, sm + i, i);
      }
    };
    {
      V<int> v;
      enum_p(v, 0, 1);
    }
  }
  void(0);
  V<ll> f(1 << (N - 1));
  for (int s = 0; s < int(1 << (N - 1)); s++) {
    V<int> p;
    int pre = -1;
    for (int i = 0; i < int(N); i++) {
      if (!(s & 1 << i)) {
        p.emplace_back(i - pre);
        pre = i;
      }
    }
    sort(p.begin(), p.end());
    f[s] = p2val[p];
  }
  void(0);
  mebius(f, N - 1);
  for (int i = 0; i < int(1 << (N - 1)); i++) cout << f[i] << " ";
  cout << endl;
}
