#include <bits/stdc++.h>
using namespace std;
const int maxn = 18, maxm = 1 << maxn, maxk = 400;
int n, m, a[maxn + 3][maxn + 3], cnt;
long long dp[maxm + 3][maxn + 3], f[maxn + 3][maxm + 3], e[maxm + 3],
    cur[maxm + 3], ans[maxk + 3], res[maxm + 3];
map<vector<int>, int> M;
vector<int> tmp, vec[maxk + 3];
void dfs(int n, int lb) {
  if (n >= lb) {
    tmp.push_back(n);
    M[tmp] = ++cnt;
    vec[cnt] = tmp;
    tmp.pop_back();
  }
  for (int i = lb; i <= n; i++) {
    tmp.push_back(i);
    dfs(n - i, i);
    tmp.pop_back();
  }
}
void fwt(long long a[], int n) {
  for (int k = 1; k < n; k <<= 1) {
    for (int i = 0; i < n; i += k << 1) {
      for (int j = i; j < i + k; j++) {
        a[j + k] += a[j];
      }
    }
  }
}
void ifwt(long long a[], int n) {
  for (int k = 1; k < n; k <<= 1) {
    for (int i = 0; i < n; i += k << 1) {
      for (int j = i; j < i + k; j++) {
        a[j + k] -= a[j];
      }
    }
  }
}
void ifmt(long long a[], int n) {
  for (int k = 1; k < n; k <<= 1) {
    for (int i = 0; i < n; i += k << 1) {
      for (int j = i; j < i + k; j++) {
        a[j] -= a[j + k];
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  dfs(n, 1);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      scanf("%1d", &a[i][j]);
    }
  for (int i = 1; i <= n; i++) dp[1 << (i - 1)][i] = 1;
  for (int msk = 1; msk <= (1 << n) - 1; msk++) {
    int d = __builtin_popcount(msk);
    for (int i = 1; i <= n; i++)
      if (msk >> (i - 1) & 1) {
        int old = msk ^ (1 << (i - 1));
        for (int j = 1; j <= n; j++)
          if ((old >> (j - 1) & 1) && a[i][j] == 1) {
            dp[msk][i] += dp[old][j];
          }
        f[d][msk] += dp[msk][i];
      }
  }
  for (int i = 1; i <= n; i++) fwt(f[i], 1 << n);
  e[0] = 1;
  fwt(e, 1 << n);
  for (int i = 1; i <= cnt; i++) {
    copy(e, e + (1 << n), cur);
    for (int j = 0; j <= vec[i].size() - 1; j++) {
      long long *a = f[vec[i][j]];
      for (int k = 0; k <= (1 << n) - 1; k++) cur[k] = cur[k] * a[k];
    }
    ifwt(cur, 1 << n);
    ans[i] = cur[(1 << n) - 1];
  }
  for (int msk = 0; msk <= (1 << (n - 1)) - 1; msk++) {
    vector<int>().swap(tmp);
    for (int i = 1, l = 1; i <= n; i += l, l = 1) {
      while (i + l <= n && (msk >> (i + l - 2) & 1)) l++;
      tmp.push_back(l);
    }
    sort(tmp.begin(), tmp.end());
    res[msk] = ans[M[tmp]];
  }
  ifmt(res, (1 << (n - 1)));
  for (int i = 0; i <= (1 << (n - 1)) - 1; i++)
    printf("%lld%c", res[i], " \n"[i == (1 << (n - 1)) - 1]);
  return 0;
}
