#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
long long n, mn = 1000000000, ans;
int d[2010], deg[2010], e[2010][2010];
char s[2010];
bool check() {
  for (int i = 1; i <= n; ++i) d[i] = deg[i];
  sort(d + 1, d + n + 1);
  int sum = 0;
  for (int i = 1; i < n; ++i) {
    sum += d[i];
    if (sum == i * (i - 1) / 2) return false;
  }
  return true;
}
void work(int x) {
  deg[x] = n - deg[x] - 1;
  for (int i = 1; i <= n; ++i) {
    if (i == x) continue;
    deg[i] += e[x][i] - e[i][x];
    e[x][i] ^= 1, e[i][x] ^= 1;
  }
}
void dfs(int x, int cnt) {
  if (cnt > mn) return;
  if (x == n + 1) {
    if (check()) {
      if (cnt < mn)
        mn = cnt, ans = 1;
      else if (cnt == mn)
        ans++;
    }
    return;
  }
  dfs(x + 1, cnt), work(x), dfs(x + 1, cnt + 1), work(x);
}
int main() {
  read(n);
  for (int i = 1; i <= n; ++i) {
    scanf("%s", s + 1);
    for (int j = 1; j <= n; ++j) deg[i] += e[i][j] = s[j] - '0';
  }
  if (check()) {
    puts("0 1");
    return 0;
  }
  for (int i = 1; i <= n; ++i) work(i), ans += check(), work(i);
  if (ans) {
    printf("1 %lld", ans);
    return 0;
  }
  dfs(1, 0);
  if (!ans)
    puts("-1");
  else {
    for (int i = 1; i <= mn; ++i) ans = ans * i % 998244353;
    printf("%lld %lld", mn, ans);
  }
  return 0;
}
