#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void cmin(T &a, T b) {
  ((a > b) && (a = b));
}
template <class T>
inline void cmax(T &a, T b) {
  ((a < b) && (a = b));
}
char IO;
template <class T = int>
T rd() {
  T s = 0;
  int f = 0;
  while (!isdigit(IO = getchar())) f |= IO == '-';
  do s = (s << 1) + (s << 3) + (IO ^ '0');
  while (isdigit(IO = getchar()));
  return f ? -s : s;
}
const int N = 2010, INF = 1e9 + 10;
int n;
char G[N][N];
int deg[N];
int Check() {
  static int t[N];
  memset(t, 0, n << 2);
  for (int i = 1, iend = n; i <= iend; ++i) t[deg[i]]++;
  int c = 0, s = 0;
  for (int i = 0, iend = n - 1; i <= iend; ++i) {
    while (t[i]--) {
      if (++c == n) return 1;
      if ((s += i) == c * (c - 1) / 2) return 0;
    }
  }
  return 1;
}
namespace pt1 {
void Solve() {
  int mi = 1e9, ans = 0;
  for (int S = 0, Send = (1 << n) - 1; S <= Send; ++S) {
    int c = __builtin_popcount(S);
    if (c > mi) continue;
    for (int i = 1, iend = n; i <= iend; ++i)
      if (S & (1 << (i - 1)))
        for (int j = 1, jend = n; j <= jend; ++j)
          if (i != j) G[i][j] ^= 1, G[j][i] ^= 1;
    for (int i = 1, iend = n; i <= iend; ++i) deg[i] = 0;
    for (int i = 1, iend = n; i <= iend; ++i)
      for (int j = 1, jend = n; j <= jend; ++j) deg[i] += G[i][j] - '0';
    if (Check()) {
      if (c < mi)
        mi = c, ans = 1;
      else
        ans++;
    }
    for (int i = 1, iend = n; i <= iend; ++i)
      if (S & (1 << (i - 1)))
        for (int j = 1, jend = n; j <= jend; ++j)
          if (i != j) G[i][j] ^= 1, G[j][i] ^= 1;
  }
  if (mi == 1e9)
    puts("-1");
  else {
    for (int i = 1, iend = mi; i <= iend; ++i) ans *= i;
    printf("%d %d\n", mi, ans);
  }
}
}  // namespace pt1
int main() {
  n = rd();
  for (int i = 1, iend = n; i <= iend; ++i) scanf("%s", G[i] + 1);
  if (n <= 6) return pt1::Solve(), 0;
  for (int i = 1, iend = n; i <= iend; ++i)
    for (int j = 1, jend = n; j <= jend; ++j) deg[i] += G[i][j] - '0';
  if (Check()) return puts("0 1"), 0;
  int ans = 0;
  for (int i = 1, iend = n; i <= iend; ++i) {
    for (int j = 1, jend = n; j <= jend; ++j)
      if (i != j) {
        if (G[i][j] == '1')
          deg[i]--, deg[j]++;
        else
          deg[j]--, deg[i]++;
      }
    ans += Check();
    for (int j = 1, jend = n; j <= jend; ++j)
      if (i != j) {
        if (G[i][j] == '0')
          deg[i]--, deg[j]++;
        else
          deg[j]--, deg[i]++;
      }
  }
  printf("1 %d\n", ans);
}
