#include <bits/stdc++.h>
const int N = 2005;
char c[N][N];
int n, i, j, d[N], b[N], ans1, ans2, od[N], ct;
inline bool ck() {
  int i, s, c;
  memset(b, 0, n << 2);
  for (i = 1; i <= n; ++i) ++b[d[i]];
  for (i = s = c = 0; i < n; ++i)
    for (; b[i]--;)
      if (++c, s += i, c < n && s == c * (c - 1) >> 1) return 0;
  return 1;
}
inline void rev(int x) {
  for (int i = 1; i <= n; ++i)
    if (x != i) {
      if (c[x][i] == '1')
        --d[x], ++d[i];
      else
        ++d[x], --d[i];
      c[x][i] ^= 1;
      c[i][x] ^= 1;
    }
}
int main() {
  scanf("%d", &n);
  for (i = 1; i <= n; ++i)
    for (scanf("%s", c[i] + 1), j = 1; j <= n; ++j) d[i] += c[i][j] == '1';
  if (ck()) {
    puts("0 1");
    return 0;
  }
  memcpy(od + 1, d + 1, n << 2);
  if (n <= 6) {
    ans1 = N;
    for (i = 1; i < 1 << n; ++i) {
      for (ct = 0, j = 0; j < n; ++j)
        if (i >> j & 1) ++ct, rev(j + 1);
      if (ck()) {
        if (ct < ans1)
          ans1 = ct, ans2 = 1;
        else
          ans2 += ct == ans1;
      }
      for (j = 0; j < n; ++j)
        if (i >> j & 1) rev(j + 1);
    }
    for (i = 1; i <= ans1; ++i) ans2 *= i;
    if (ans1 == N) {
      puts("-1");
      return 0;
    }
  } else
    for (ans1 = 1, i = 1; i <= n; ++i) {
      rev(i);
      if (ck()) ++ans2;
      rev(i);
    }
  printf("%d %d\n", ans1, ans2);
  return 0;
}
