#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  return x * f;
}
const int MAXN = 100010;
const int INF = 2147483600;
int N;
char s[2010];
bool e[2010][2010];
int a[2010], b[2010];
int mn, ans, tms;
inline bool check() {
  for (int i = 1; i <= N; i++) b[i] = a[i];
  sort(b + 1, b + N + 1);
  int sum = 0;
  for (int i = 1; i <= N; i++) {
    sum += b[i];
    if (sum == i * (i - 1) / 2) {
      return (i == N);
    }
  }
  return 0;
}
inline void Flip(int k) {
  for (int i = 1; i <= N; i++) {
    a[k] -= e[k][i];
    a[i] -= e[i][k];
    e[i][k] ^= 1;
    e[k][i] ^= 1;
    a[k] += e[k][i];
    a[i] += e[i][k];
  }
  return;
}
inline void force(int k) {
  if (k == N + 1) {
    if (check()) {
      if (tms < mn) ans = 0, mn = tms;
      if (tms == mn) ++ans;
    }
    return;
  }
  force(k + 1);
  ++tms;
  Flip(k);
  force(k + 1);
  --tms;
  Flip(k);
  return;
}
inline void ck() {
  if (!ans) {
    puts("-1");
    exit(0);
  }
}
int main() {
  N = read();
  for (int i = 1; i <= N; i++) {
    scanf("%s", s + 1);
    for (int j = 1; j <= N; j++) {
      e[i][j] = s[j] - '0';
      a[i] += e[i][j];
    }
  }
  if (check()) {
    puts("0 1");
    return 0;
  }
  if (N <= 6)
    mn = INF, force(1), ck(), printf("%d ", mn);
  else {
    for (int i = 1; i <= N; i++) Flip(i), ans += check(), Flip(i);
    ck();
    printf("%d ", 1);
  }
  int fac = 1;
  for (int i = 2; i <= mn; i++) fac = fac * i;
  printf("%d\n", ans * fac);
  return 0;
}
