#include <bits/stdc++.h>
using namespace std;
const long double PI = 3.1415926535897932384626433832795;
const int RADIUS = 5;
const int RADIUS2 = 1;
int n;
int ma[2100][2100];
void Load() {
  scanf("%d", &n);
  int i, j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      scanf("%d", &ma[i][j]);
    }
  }
}
const int di[4] = {-1, 1, 0, 0};
const int dj[4] = {0, 0, 1, -1};
int was[2100][2100];
vector<pair<int, int> > q;
int nrect, ncirc;
void Process(int bi, int bj) {
  q.clear();
  q.push_back(make_pair(bi, bj));
  int hd = 0;
  was[bi][bj] = 1;
  while (hd < q.size()) {
    int ni, nj, k;
    for (k = 0; k < 4; k++) {
      ni = q[hd].first + di[k];
      nj = q[hd].second + dj[k];
      if (ni < 0 || ni >= n || nj < 0 || nj >= n) continue;
      if (was[ni][nj] == 0 && ma[ni][nj] == 1) {
        q.push_back(make_pair(ni, nj));
        was[ni][nj] = 1;
      }
    }
    hd++;
  }
  if (q.size() < 10) return;
  int i;
  int li = n;
  int lj = n;
  int ri = 0;
  int rj = 0;
  for (i = 0; i < q.size(); i++) {
    if (q[i].first < li) li = q[i].first;
    if (q[i].first > ri) ri = q[i].first;
    if (q[i].second < lj) lj = q[i].second;
    if (q[i].second > rj) rj = q[i].second;
  }
  long double midi = (li + ri + 0.0) / 2.0;
  long double midj = (lj + rj + 0.0) / 2.0;
  long double h = ((ri - li + 1.0) / 2.0 + (rj - lj + 1.0) / 2.0) / 2.0;
  long double maxdelta = 0;
  for (i = 0; i < q.size(); i++) {
    long double cd = sqrt((q[i].first - midi) * (q[i].first - midi) +
                          (q[i].second - midj) * (q[i].second - midj));
    maxdelta = max(maxdelta, cd);
  }
  long double sqr = q.size();
  if (fabs(sqr / (PI * h * h) - 1) < 0.1) {
    if (fabs(maxdelta / h - 1) < 0.08) {
      ncirc++;
    } else
      nrect++;
  } else {
    nrect++;
  }
}
int nma[2100][2100];
int csum[2100][2100];
void UnNoise() {
  memset(csum, 0, sizeof(csum));
  int i, j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      int sum, sz;
      sum = sz = 0;
      int ii, jj;
      for (ii = i - RADIUS; ii <= i + RADIUS; ii++) {
        for (jj = j - RADIUS; jj <= j + RADIUS; jj++) {
          if ((ii - i) * (ii - i) + (jj - j) * (jj - j) <= RADIUS * RADIUS) {
            if (ii < 0 || ii >= n || jj < 0 || jj >= n) {
              sz++;
              continue;
            }
            sz++;
            sum += ma[ii][jj];
          }
        }
      }
      if (sum > sz / 2)
        nma[i][j] = 1;
      else
        nma[i][j] = 0;
    }
  }
  memcpy(ma, nma, sizeof(ma));
}
void Solve() {
  int i, j;
  nrect = ncirc = 0;
  UnNoise();
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (ma[i][j] == 1 && was[i][j] == 0) {
        Process(i, j);
      }
    }
  }
  printf("%d %d\n", ncirc, nrect);
}
int main() {
  Load();
  Solve();
  return 0;
}
