#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
char str[MAXN];
int n, G[MAXN][MAXN], H[MAXN][MAXN], deg[MAXN], tdeg[MAXN];
inline bool check() {
  sort(tdeg + 1, tdeg + n + 1);
  int sum = 0;
  for (int i = 1; i < n; i++) {
    sum += tdeg[i];
    if (sum == i * (i - 1) / 2) return false;
  }
  return true;
}
inline int count(int x) {
  int res = 0;
  for (; x; x -= x & -x) res++;
  return res;
}
inline void reverse(int x) {
  for (int i = 1; i <= n; i++)
    if (i != x) G[x][i] ^= 1, G[i][x] ^= 1;
}
inline void solve1() {
  int ans = 1 << 30, cnt = 0;
  for (int st = 1; st < (1 << n); st++) {
    for (int i = 1; i <= n; i++)
      if (st & (1 << (i - 1))) reverse(i);
    memset(tdeg, 0, sizeof(tdeg));
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) tdeg[i] += G[i][j];
    if (check()) {
      int c = count(st);
      if (c < ans)
        ans = c, cnt = 1;
      else if (c == ans)
        cnt++;
    }
    for (int i = 1; i <= n; i++)
      if (st & (1 << (i - 1))) reverse(i);
  }
  if (cnt) {
    for (int i = 1; i <= ans; i++) cnt *= i;
    cout << ans << " " << cnt << endl;
  } else
    cout << -1 << endl;
}
inline void reverse1(int x) {
  tdeg[x] = n - deg[x] - 1;
  for (int y = 1; y <= n; y++)
    if (y != x) {
      tdeg[y] -= G[y][x];
      G[x][y] ^= 1, G[y][x] ^= 1;
      tdeg[y] += G[y][x];
    }
}
inline void solve2() {
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    memcpy(tdeg, deg, sizeof(deg));
    reverse1(i);
    cnt += check();
    reverse1(i);
  }
  cout << 1 << " " << cnt << endl;
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> str + 1;
    for (int j = 1; j <= n; j++) deg[i] += G[i][j] = str[j] - '0';
  }
  memcpy(tdeg, deg, sizeof(deg));
  if (check()) {
    cout << 0 << " " << 1 << endl;
    return 0;
  }
  if (n <= 6)
    solve1();
  else
    solve2();
  return 0;
}
