#include <bits/stdc++.h>
using namespace std;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
int n, a[2020][2020], square, circle, d[2020][2020], qx[4000400], qy[4000400],
    q;
double dist(double x, double y, double xx, double yy) {
  return sqrt(((x - xx) * (x - xx)) + ((y - yy) * (y - yy)));
}
int isSquare(int x, int y) {
  int maxX = x, minX = x, maxY = y, minY = y, cur = 1, X = x, Y = y;
  d[x][y] = q = 1;
  qx[1] = x;
  qy[1] = y;
  while (cur <= q) {
    x = qx[cur];
    y = qy[cur++];
    for (int i = 0; i < 4; i++) {
      int xx = x + dx[i], yy = y + dy[i];
      if (xx && yy && xx <= n && yy <= n && a[xx][yy] && !d[xx][yy]) {
        d[xx][yy] = 1;
        qx[++q] = xx;
        qy[q] = yy;
        X += xx;
        Y += yy;
        minX = min(minX, xx);
        maxX = max(maxX, xx);
        minY = min(minY, yy);
        maxY = max(maxY, yy);
      }
    }
  }
  if (q == (maxX - minX + 1) * (maxY - minY + 1)) return 1;
  double cx = 1.0 * X / q, cy = 1.0 * Y / q;
  int border = 1;
  vector<double> D;
  for (int i = 1; i <= q; i++) D.push_back(-dist(cx, cy, qx[i], qy[i]));
  sort(D.begin(), D.end());
  for (int i = 1; i <= int(D.size()) - 1; i++)
    if (fabs(D[i] - D[0]) < 2)
      border++;
    else
      break;
  return border < 100;
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (a[i][j] && !d[i][j])
        if (isSquare(i, j))
          square++;
        else
          circle++;
  cout << circle << ' ' << square << endl;
}
