#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
char s[N];
int n, g[N][N], h[N][N], deg[N], tdeg[N];
bool check() {
  sort(tdeg + 1, tdeg + n + 1);
  int sum = 0;
  for (int i = 1; i < n; i++) {
    sum += tdeg[i];
    if (sum == i * (i - 1) / 2) return 0;
  }
  return 1;
}
inline int lowbit(int x) { return x & -x; }
int popcnt(int x) {
  int ret = 0;
  while (x) ++ret, x -= lowbit(x);
  return ret;
}
void rev(int x) {
  for (int i = 1; i <= n; i++)
    if (i != x) g[x][i] ^= 1, g[i][x] ^= 1;
}
void solve1() {
  int ans = INT_MAX, cnt = 0;
  for (int msk = 1; msk < (1 << n); msk++) {
    for (int i = 0; i < n; i++)
      if (msk & (1 << i)) rev(i + 1);
    memset(tdeg, 0, sizeof(tdeg));
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) tdeg[i] += g[i][j];
    if (check()) {
      int c = popcnt(msk);
      if (c < ans)
        ans = c, cnt = 1;
      else if (c == ans)
        ++cnt;
    }
    for (int i = 0; i < n; i++)
      if (msk & (1 << i)) rev(i + 1);
  }
  if (cnt) {
    for (int i = 1; i <= ans; i++) cnt *= i;
    cout << ans << ' ' << cnt << endl;
  } else
    cout << -1 << endl;
}
inline void rev1(int x) {
  tdeg[x] = n - deg[x] - 1;
  for (int y = 1; y <= n; y++)
    if (y != x) {
      tdeg[y] -= g[y][x];
      g[x][y] ^= 1;
      g[y][x] ^= 1;
      tdeg[y] += g[y][x];
    }
}
void solve2() {
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    memcpy(tdeg, deg, sizeof(tdeg));
    rev1(i);
    cnt += check();
    rev1(i);
  }
  cout << 1 << ' ' << cnt << endl;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> (s + 1);
    for (int j = 1; j <= n; j++) deg[i] += (g[i][j] = s[j] - '0');
  }
  memcpy(tdeg, deg, sizeof(tdeg));
  if (check()) {
    cout << "0 1" << endl;
    return 0;
  }
  if (n < 7)
    solve1();
  else
    solve2();
  return 0;
}
