#include <bits/stdc++.h>
using namespace std;
const int N = 2100;
const double eps = 1e-9;
const double board = 0.25;
const int qq = 1;
const int oo = 1000000000;
const int dx[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dy[] = {-1, 1, 0, 0, -1, 1, -1, 1};
int n, a[N][N], rec, cir, d;
pair<int, int> q[((N) * (N))];
double u[N];
bool flag[N][N];
double dis(double xa, double ya, double xb, double yb) {
  return sqrt(((xb - xa) * (xb - xa)) + ((yb - ya) * (yb - ya)));
}
void update(double a[], double c) {
  for (int i = 0; i < qq; ++i)
    if (c > a[i]) {
      for (int j = qq - 1; j > i; --j) {
        a[j] = a[j - 1];
      }
      a[i] = c;
      break;
    }
}
void bfs(int x, int y) {
  int head = 0, tail = 1;
  q[0] = make_pair(x, y);
  int t = 1, xmin = x - 1, xmax = x, ymin = y - 1, ymax = y;
  flag[x][y] = true;
  while (head < tail) {
    int ox = q[head].first, oy = q[head].second;
    head++;
    for (int d = 0; d < 4; ++d) {
      int nx = ox + dx[d], ny = oy + dy[d];
      if (((0) <= (nx) && (nx) <= (n - 1)) &&
          ((0) <= (ny) && (ny) <= (n - 1)) && a[nx][ny] && !flag[nx][ny]) {
        flag[nx][ny] = true;
        xmin = min(xmin, nx - 1);
        xmax = max(xmax, nx);
        ymin = min(ymin, ny - 1);
        ymax = max(ymax, ny);
        q[tail++] = make_pair(nx, ny);
        ++t;
      }
    }
  }
  double xmid = (xmax + xmin) / 2.0, ymid = (ymax + ymin) / 2.0;
  double far[qq];
  memset(far, 0, sizeof(far));
  for (int i = 0; i < tail; ++i) {
    double tmp = 0;
    tmp = max(tmp, dis(q[i].first - 1, q[i].second - 1, xmid, ymid));
    tmp = max(tmp, dis(q[i].first - 1, q[i].second, xmid, ymid));
    tmp = max(tmp, dis(q[i].first, q[i].second - 1, xmid, ymid));
    tmp = max(tmp, dis(q[i].first, q[i].second, xmid, ymid));
    update(far, tmp);
  }
  double ff = 0;
  for (int i = 0; i < qq; ++i) {
    ff += far[i];
  }
  ff /= qq;
  ff = far[qq - 1];
  if (ff > 7.4) {
    u[d++] = acos(-1.0) * ((ff) * (ff)) / t;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      scanf("%d", &a[i][j]);
    }
  }
  memset(flag, 0, sizeof(flag));
  rec = cir = 0;
  d = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j)
      if (!flag[i][j] && a[i][j]) {
        bfs(i, j);
      }
  }
  sort(u, u + d);
  for (int i = 0; i < d; ++i) {
    if ((u[i] - u[0]) / u[0] < board) {
      ++cir;
    } else {
      ++rec;
    }
  }
  printf("%d %d\n", cir, rec);
  return 0;
}
