#include <bits/stdc++.h>
using namespace std;
int n, mp[20];
long long dp[20][(1 << 18) + 5], g[20][(1 << 18) + 5], f[(1 << 17) + 5];
void fwt_or(long long* a, int n) {
  for (int i = 1; i < (1 << n); i <<= 1)
    for (int j = 0; j < (1 << n); j += i << 1)
      for (int k = 0; k < i; ++k) a[i + j + k] += a[j + k];
}
void ifwt_and(long long* a, int n) {
  for (int i = 1; i < (1 << n); i <<= 1)
    for (int j = 0; j < (1 << n); j += i << 1)
      for (int k = 0; k < i; ++k) a[j + k] -= a[i + j + k];
}
void init() {
  for (int i = (0); i <= (n - 1); ++i) dp[i][1 << i] = 1;
  for (int i = (1); i <= ((1 << n) - 1); ++i) {
    for (int j = (0); j <= (n - 1); ++j)
      if (i >> j & 1) {
        for (int k = (0); k <= (n - 1); ++k)
          if (~i >> k & 1)
            if (mp[j] >> k & 1) {
              dp[k][i ^ (1 << k)] += dp[j][i];
            }
      }
  }
  for (int i = (0); i <= (n - 1); ++i)
    for (int j = (0); j <= ((1 << n) - 1); ++j)
      g[__builtin_popcount(j)][j] += dp[i][j];
  for (int i = (0); i <= (n - 1); ++i) fwt_or(g[i], n);
}
long long A[20][(1 << 18) + 5];
void dot(long long* a, long long* b, long long* c) {
  for (int i = (0); i <= ((1 << n) - 1); ++i) c[i] = a[i] * b[i];
}
map<vector<int>, long long> res;
vector<int> now;
void dfs(int k1, int k2, int k3) {
  if (!k3) {
    long long x = 0;
    for (int i = (0); i <= ((1 << n) - 1); ++i)
      x += A[k1][i] * (__builtin_popcount((1 << n) - 1 - i) & 1 ? -1 : 1);
    res[now] = x;
    return;
  }
  for (int i = (k2); i <= (k3); ++i)
    dot(A[k1], g[i], A[k1 + 1]), now.push_back(i), dfs(k1 + 1, i, k3 - i),
        now.pop_back();
}
int main() {
  scanf("%d", &n);
  for (int i = (0); i <= (n - 1); ++i) {
    for (int j = (0); j <= (n - 1); ++j) {
      int c;
      while (!isdigit(c = getchar()))
        ;
      if (c & 1) mp[i] ^= 1 << j;
    }
  }
  init();
  for (int i = (0); i <= ((1 << n) - 1); ++i) A[0][i] = 1;
  dfs(0, 1, n);
  auto calc = [&](int i) {
    vector<int> cur;
    for (int l = 0, r; l < n; l = r + 1) {
      r = l;
      while (r < n && (i >> r & 1)) ++r;
      cur.push_back(r - l + 1);
    }
    sort(cur.begin(), cur.end());
    return res[cur];
  };
  for (int i = (0); i <= ((1 << (n - 1)) - 1); ++i) {
    f[i] = calc(i);
  }
  ifwt_and(f, n - 1);
  for (int i = (0); i <= ((1 << (n - 1)) - 1); ++i) printf("%lld ", f[i]);
  return 0;
}
