#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
int n, all;
int cnt[262154];
long long f[262154], g[20][262154], h[20][262154], v[20][262154];
char w[20][20];
vector<int> ve;
map<vector<int>, long long> mp;
void dfs(int x, int pre, int sum) {
  if (sum == n) {
    long long val = 0;
    for (int i = 0; i < all; ++i)
      val += v[x][i] * (cnt[i ^ (all - 1)] & 1 ? -1 : 1);
    mp[ve] = val;
    return;
  }
  for (int i = pre; i + sum <= n; ++i) {
    for (int j = 0; j < all; ++j) v[x + 1][j] = v[x][j] * g[i][j];
    ve.push_back(i), dfs(x + 1, i, i + sum), ve.pop_back();
  }
}
int main() {
  read(n), all = 1 << n;
  for (int i = 1; i < all; ++i) cnt[i] = cnt[i >> 1] + (i & 1);
  for (int i = 0; i < n; ++i) scanf("%s", w[i]), h[i][1 << i] = 1;
  for (int i = 0; i < all; ++i)
    for (int j = 0; j < n; ++j)
      for (int k = 0; k < n; ++k)
        if (!((i >> k) & 1) && w[j][k] == '1') h[k][i | (1 << k)] += h[j][i];
  for (int i = 0; i < all; ++i)
    for (int j = 0; j < n; ++j) g[cnt[i]][i] += h[j][i];
  for (int x = 1; x <= n; ++x)
    for (int len = 1; len < all; len <<= 1)
      for (int i = 0; i < all; i += len << 1)
        for (int j = i; j < i + len; ++j) g[x][j + len] += g[x][j];
  for (int i = 0; i < all; ++i) v[0][i] = 1;
  dfs(0, 1, 0), all >>= 1;
  for (int s = 0; s < all; ++s) {
    ve.clear();
    int pos;
    for (int i = 0; i < n; i = pos + 1) {
      pos = i;
      while (pos < n - 1 && (s >> pos) & 1) pos++;
      ve.push_back(pos - i + 1);
    }
    sort(ve.begin(), ve.end()), f[s] = mp[ve];
  }
  for (int len = 1; len < all; len <<= 1)
    for (int i = 0; i < all; i += len << 1)
      for (int j = i; j < i + len; ++j) f[j] -= f[j + len];
  for (int i = 0; i < all; ++i) printf("%lld ", f[i]);
  return 0;
}
