#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
int gi() {
  int x = 0, o = 1;
  char ch = getchar();
  while (!isdigit(ch) && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
int n, out[N], t[N];
char s[N];
bool G[N][N];
bool check() {
  memset(t, 0, sizeof(t));
  for (int i = 1; i <= n; i++) ++t[out[i]];
  int sout = 0, k = 0;
  for (int i = n - 1; ~i; i--)
    for (int j = 1; j <= t[i]; j++) {
      sout += i;
      ++k;
      if (k < n && sout == k * (k - 1) / 2 + k * (n - k)) return 0;
    }
  return 1;
}
void rev(int i) {
  for (int j = 1; j <= n; j++) {
    if (i == j) continue;
    G[j][i] ^= 1;
    if (G[i][j])
      G[i][j] = 0, --out[i], ++out[j];
    else
      G[i][j] = 1, ++out[i], --out[j];
  }
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    for (int j = 1; j <= n; j++) G[i][j] = s[j] - '0', out[i] += G[i][j];
  }
  if (check()) return cout << "0 1", 0;
  int ways = 0;
  for (int i = 1; i <= n; i++) {
    rev(i);
    if (check()) ++ways;
    rev(i);
  }
  if (ways > 0) return cout << "1 " << ways, 0;
  ways = 0;
  int mn = 1e9;
  for (int i = 2; i < (1 << n); i++) {
    for (int j = 1; j <= n; j++)
      if (i >> (j - 1) & 1) rev(j);
    if (check()) {
      int now = __builtin_popcount(i);
      if (now < mn) mn = now, ways = 0;
      if (now == mn) ++ways;
    }
    for (int j = 1; j <= n; j++)
      if (i >> (j - 1) & 1) rev(j);
  }
  if (mn == 1e9)
    cout << -1;
  else {
    for (int i = 1; i <= mn; i++) ways *= i;
    cout << mn << ' ' << ways;
  }
  return 0;
}
