#include <bits/stdc++.h>
using namespace std;
using i64 = int_fast64_t;
using u64 = uint_fast64_t;
bool adj[18][18];
i64 dp[1 << 18][18];
i64 lenCnt[19][1 << 18];
template <typename T>
void subset_transform(int N, T a[1 << 18]) {
  int L = 1 << N;
  for (int k = 1; k < L; k *= 2) {
    for (int i = 0; i < L; i += 2 * k) {
      for (int j = 0; j < k; j++) {
        a[i + j + k] += a[i + j];
      }
    }
  }
}
template <typename T>
void inverse_superset_transform(int N, T a[1 << 18]) {
  int L = 1 << N;
  for (int k = 1; k < L; k *= 2) {
    for (int i = 0; i < L; i += 2 * k) {
      for (int j = 0; j < k; j++) {
        a[i + j] -= a[i + j + k];
      }
    }
  }
}
i64 ans[1 << 17];
int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  int N;
  cin >> N;
  for (int i = 0; i < N; i++) {
    string s;
    cin >> s;
    for (int j = 0; j < N; j++) {
      adj[i][j] = s[j] - '0';
    }
  }
  for (int i = 0; i < N; i++) {
    dp[1 << i][i] = 1;
  }
  for (int m = 1; m < (1 << N); m++) {
    for (int i = 0; i < N; i++) {
      if (!(m & (1 << i))) continue;
      for (int j = 0; j < N; j++) {
        if (m & (1 << j)) continue;
        if (adj[i][j]) {
          dp[m | (1 << j)][j] += dp[m][i];
        }
      }
    }
  }
  for (int m = 1; m < (1 << N); m++) {
    int pc = __builtin_popcount(m);
    for (int i = 0; i < N; i++) {
      lenCnt[pc][m] += dp[m][i];
    }
  }
  for (int l = 1; l <= N; l++) {
    subset_transform(N, lenCnt[l]);
  }
  unordered_map<u64, i64> memo;
  for (int p = 0; p < (1 << (N - 1)); p++) {
    int cnt = 0;
    vector<int> partition;
    for (int i = 0; i < N; i++) {
      cnt++;
      if (!(p & (1 << i))) {
        partition.push_back(cnt);
        cnt = 0;
      }
    }
    sort(partition.begin(), partition.end());
    u64 code = 0;
    for (int l : partition) {
      code = 19260817 * code + l;
    }
    if (!memo.count(code)) {
      i64 res = 0;
      for (int m = 1; m < (1 << N); m++) {
        i64 v = 1;
        for (int l : partition) {
          v *= lenCnt[l][m];
        }
        if ((N - __builtin_popcount(m)) % 2 == 0) {
          res += v;
        } else {
          res -= v;
        }
      }
      memo[code] = res;
    }
    ans[p] = memo[code];
  }
  inverse_superset_transform(N - 1, ans);
  for (int p = 0; p < (1 << (N - 1)); p++) {
    cout << ans[p] << " \n"[p == (1 << (N - 1)) - 1];
  }
  return 0;
}
