#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int f = 1, ans = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    ans = ans * 10 + c - '0';
    c = getchar();
  }
  return f * ans;
}
const int MAXN = 2e3 + 11;
int d[MAXN], D[MAXN], N, M, A[MAXN][MAXN];
void copy() {
  for (int i = 1; i <= N; i++) D[i] = d[i];
  return;
}
int calc() {
  int res = 0, cnt = 0;
  sort(D + 1, D + N + 1);
  for (int i = 1; i <= N; i++) {
    res += D[i];
    if (res == (i * (i - 1) / 2)) cnt++;
  }
  return cnt;
}
bool col[MAXN];
char str[MAXN];
int main() {
  N = read();
  for (int i = 1; i <= N; i++) {
    scanf("%s", str + 1);
    for (int j = 1; j <= N; j++) {
      A[i][j] = str[j] - '0';
      if (A[i][j]) d[j]++;
    }
  }
  copy();
  if (calc() == 1) {
    printf("0 1\n");
    return 0;
  }
  if (N <= 6) {
    int cnt = N + 1, ans = 0;
    for (int S = 1; S < (1 << N); S++) {
      int num = 0;
      for (int i = 1; i <= N; i++) col[i] = S & (1 << (i - 1)), num += col[i];
      memset(D, 0, sizeof(D));
      for (int u = 1; u <= N; u++)
        for (int v = 1; v <= N; v++)
          if (A[u][v]) {
            if (col[u] ^ col[v])
              D[v]++;
            else
              D[u]++;
          }
      if (calc() != 1) continue;
      if (num < cnt)
        cnt = num, ans = 1;
      else if (num == cnt)
        ans++;
    }
    if (cnt == N + 1) {
      printf("-1\n");
      return 0;
    }
    int mul = 1;
    for (int i = 1; i <= cnt; i++) mul *= i;
    printf("%d %d\n", cnt, ans * mul);
    return 0;
  }
  int cnt = 0;
  for (int u = 1; u <= N; u++) {
    copy();
    for (int v = 1; v <= N; v++) {
      if (A[u][v]) D[v]--, D[u]++;
      if (A[v][u]) D[u]--, D[v]++;
    }
    if (calc() == 1) cnt++;
  }
  printf("1 %d\n", cnt);
  return 0;
}
