#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2048;
const double BLACK_LIM = 0.5;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
int n;
int m[MAXN][MAXN];
double a[MAXN][MAXN];
double b[MAXN][MAXN];
int level[MAXN][MAXN];
int c, s, area;
void read() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) scanf("%d", &m[i][j]);
}
void removeNoise() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (m[i][j])
        a[i][j] = 1.0;
      else
        a[i][j] = 0.0;
  for (int iter = 0; iter < 3; iter++) {
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) {
        double sum = a[i][j];
        int cnt = 1;
        for (int k = 0; k < 4; k++) {
          int nxtX = i + dx[k];
          int nxtY = j + dy[k];
          if (nxtX >= 0 && nxtX < n && nxtY >= 0 && nxtY < n) {
            sum += a[nxtX][nxtY];
            cnt++;
          }
        }
        b[i][j] = sum / (double)cnt;
      }
    memcpy(a, b, sizeof(b));
  }
}
bool isBlack(int i, int j) { return a[i][j] > BLACK_LIM; }
bool check(int x, int y) {
  if (x < 0 || x >= n || y < 0 || y >= n) return false;
  if (level[x][y]) return false;
  return isBlack(x, y);
}
int dist(pair<int, int> a, pair<int, int> b) {
  return (a.first - b.first) * (a.first - b.first) +
         (a.second - b.second) * (a.second - b.second);
}
double bfs(int x, int y) {
  queue<pair<int, int> > q;
  pair<int, int> start = make_pair(x, y);
  int mx = 0;
  area = 0;
  level[x][y] = 1;
  q.push(make_pair(x, y));
  area++;
  while (!q.empty()) {
    pair<int, int> tmp = q.front();
    q.pop();
    if (mx - dist(start, tmp) < 0.0) {
      mx = dist(start, tmp);
    }
    for (int i = 0; i < 4; i++) {
      pair<int, int> nxt = make_pair(tmp.first + dx[i], tmp.second + dy[i]);
      if (check(nxt.first, nxt.second)) {
        area++;
        level[nxt.first][nxt.second] = level[tmp.first][tmp.second] + 1;
        q.push(nxt);
      }
    }
  }
  return sqrt((double)mx);
}
void solve() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (!level[i][j] && isBlack(i, j)) {
        double D = bfs(i, j);
        double r1 = (D * D) / 2 - (double)area;
        double r2 = (M_PI * D * D) / 4 - (double)area;
        if (fabs(r1) < fabs(r2)) {
          if (sqrt((double)area) > 15) s++;
        } else {
          if (D > 15) c++;
        }
      }
  cout << c << " " << s << endl;
}
int main() {
  read();
  removeNoise();
  solve();
  return 0;
}
