#include <bits/stdc++.h>
using namespace std;
char str[2005];
int n, G[2005][2005], H[2005][2005], deg0[2005], deg1[2005];
bool Check() {
  sort(deg1 + 1, deg1 + n + 1);
  int sum = 0;
  for (int i = 1; i < n; i++) {
    sum += deg1[i];
    if (sum == i * (i - 1) / 2) return 0;
  }
  return 1;
}
int Bitcnt(int x) {
  int res = 0;
  for (; x; x -= x & -x) res++;
  return res;
}
void Reverse(int x) {
  for (int i = 1; i <= n; i++)
    if (i != x) G[x][i] ^= 1, G[i][x] ^= 1;
}
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(deg1, 0, sizeof(deg1));
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) deg1[i] += G[i][j];
    if (Check()) {
      int c = Bitcnt(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;
    printf("%d %d\n", ans, cnt);
  } else
    puts("-1");
}
void Reverse1(int x) {
  deg1[x] = n - deg0[x] - 1;
  for (int y = 1; y <= n; y++)
    if (y != x) {
      deg1[y] -= G[y][x];
      G[x][y] ^= 1, G[y][x] ^= 1;
      deg1[y] += G[y][x];
    }
}
void Solve2() {
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    memcpy(deg1, deg0, sizeof(deg0));
    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++) deg0[i] += G[i][j] = str[j] - '0';
  }
  memcpy(deg1, deg0, sizeof(deg0));
  if (Check()) {
    cout << 0 << " " << 1 << endl;
    return 0;
  }
  if (n <= 6)
    Solve1();
  else
    Solve2();
}
