#include <bits/stdc++.h>
using namespace std;
const int N = 20, M = 1 << 18 | 5;
struct state {
  int a[20];
  bool operator<(const state &b) const {
    for (int i = (int)(0); i <= (int)(19); i++)
      if (a[i] != b.a[i]) return a[i] < b.a[i];
    return 0;
  }
} sta[1005];
map<state, int> mp;
int top, n, p, cnt[M];
char tr[N][N];
long long f[M][N], g[N][M];
long long val[1005], h[M];
void dfs(int n, int d, state tmp) {
  if (!n) {
    sta[++top] = tmp;
    mp[tmp] = top;
    return;
  }
  if (n < d) return;
  for (; n >= 0; n -= d) {
    dfs(n, d + 1, tmp);
    tmp.a[d]++;
  }
}
void dfss(int n, int d, long long v1, int S) {
  if (!n) return val[++p] += v1, void(0);
  if (n < d) return;
  for (; n >= 0; n -= d) {
    dfss(n, d + 1, v1, S);
    v1 *= g[d][S];
  }
}
int main() {
  scanf("%d", &n);
  for (int i = (int)(0); i <= (int)(n - 1); i++) scanf("%s", tr[i]);
  for (int i = (int)(0); i <= (int)(n - 1); i++)
    for (int j = (int)(0); j <= (int)(n - 1); j++) tr[i][j] -= '0';
  for (int i = (int)(0); i <= (int)((1 << n) - 1); i++)
    cnt[i] = cnt[i / 2] + (i & 1);
  for (int i = (int)(0); i <= (int)(n - 1); i++) f[1 << i][i] = 1;
  for (int i = (int)(0); i <= (int)((1 << n) - 1); i++)
    for (int j = (int)(0); j <= (int)(n - 1); j++)
      if (i & (1 << j))
        for (int k = (int)(0); k <= (int)(n - 1); k++)
          if (!(i & (1 << k)))
            if (!tr[j][k]) f[i | (1 << k)][k] += f[i][j];
  for (int i = (int)(0); i <= (int)((1 << n) - 1); i++)
    for (int j = (int)(0); j <= (int)(n - 1); j++) g[cnt[i]][i] += f[i][j];
  for (int s = (int)(0); s <= (int)(n); s++)
    for (int d = 1; d < 1 << n; d <<= 1)
      for (int i = 0; i < 1 << n; i += d << 1)
        for (int j = 0; j < d; j++) g[s][i + j + d] += g[s][i + j];
  state tmp;
  memset(tmp.a, 0, sizeof(tmp.a));
  dfs(n, 1, tmp);
  for (int i = (int)(0); i <= (int)((1 << n) - 1); i++)
    p = 0, dfss(n, 1, ((n - cnt[i]) & 1 ? -1 : 1), i);
  --n;
  for (int i = (int)(0); i <= (int)((1 << n) - 1); i++) {
    memset(tmp.a, 0, sizeof(tmp.a));
    int l = 0;
    for (int j = (int)(0); j <= (int)(n); j++)
      if ((i & (1 << j)) || j == n)
        ++tmp.a[l + 1], l = 0;
      else
        ++l;
    h[i] = val[mp[tmp]];
  }
  for (int d = 1; d < 1 << n; d <<= 1)
    for (int i = 0; i < 1 << n; i += (d << 1))
      for (int j = 0; j < d; j++) h[i + j + d] -= h[i + j];
  for (int i = (int)(0); i <= (int)((1 << n) - 1); i++) printf("%lld ", h[i]);
}
