#include <bits/stdc++.h>
#pragma comment(linker, "/stack:64000000")
using namespace std;
template <typename X>
inline X abs(const X &a) {
  return a < 0 ? -a : a;
}
template <typename X>
inline X sqr(const X &a) {
  return a * a;
}
const int INF = INT_MAX / 2;
const long long INF64 = LLONG_MAX / 2LL;
const long double EPS = 1E-9;
const long double PI = 3.1415926535897932384626433832795;
const int N = 2 * 1000 + 13;
int n;
inline bool correct(const pair<int, int> &a) {
  return a.first >= 0 && a.first < n && a.second >= 0 && a.second < n;
}
int a[N][N];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
int used[N][N];
int d[N][N];
int color = 1;
pair<int, int> bfs(int x, int y) {
  queue<pair<int, int> > q;
  q.push(make_pair(x, y));
  d[x][y] = 0;
  used[x][y] = color;
  int best = 0;
  pair<int, int> res = make_pair(x, y);
  while (!q.empty()) {
    pair<int, int> v = q.front();
    q.pop();
    if (d[v.first][v.second] > best) {
      best = d[v.first][v.second];
      res = v;
    }
    for (int i = 0; i < int(4); i++) {
      pair<int, int> next = make_pair(v.first + dx[i], v.second + dy[i]);
      if (!correct(next)) continue;
      if (a[next.first][next.second] == 0 || used[next.first][next.second])
        continue;
      d[next.first][next.second] = d[v.first][v.second] + 1;
      used[next.first][next.second] = color;
      q.push(next);
    }
  }
  return res;
}
inline long double dist(const pair<int, int> &a, const pair<int, int> &b) {
  return sqrt(sqr((long double)a.first - b.first) +
              sqr((long double)a.second - b.second));
}
struct pt {
  long double x, y;
  pt() {}
  pt(long double x, long double y) : x(x), y(y) {}
};
const long double MAGIC_PROB = 0.8;
const int MAGIC = 5;
int main() {
  cin >> n;
  for (int i = 0; i < int(n); i++)
    for (int j = 0; j < int(n); j++) scanf("%d", &a[i][j]);
  int cnt1 = 0, cnt2 = 0;
  memset(d, 63, sizeof d);
  for (int i = 0; i < int(n); i++) {
    for (int j = 0; j < int(n); j++) {
      if (used[i][j] || a[i][j] == 0) continue;
      pair<int, int> p = make_pair(i, j);
      pair<int, int> q = bfs(i, j);
      color++;
      long double d = dist(p, q);
      pt v = pt(q.first - p.first, q.second - p.second);
      v.x /= sqrt(2.0), v.y /= sqrt(2.0);
      pt res;
      res.x = v.x * cos(PI / 4) - v.y * sin(PI / 4);
      res.y = v.x * sin(PI / 4) + v.y * cos(PI / 4);
      res.x += p.first;
      res.y += p.second;
      int cnt = 0;
      pair<int, int> next =
          make_pair((int(res.x) + i) >> 1, (int(res.y) + j) >> 1);
      int sz = 0;
      for (int x = max(0, next.first - MAGIC);
           x <= min(n - 1, next.first + MAGIC); x++)
        for (int y = max(0, next.second - MAGIC);
             y <= min(n - 1, next.second + MAGIC); y++) {
          if (correct(make_pair(x, y)) && used[x][y] == color - 1) {
            cnt++;
          }
          sz++;
        }
      if ((long double)cnt / (long double)sz > MAGIC_PROB + EPS)
        cnt1++;
      else
        cnt2++;
    }
  }
  cout << cnt1 << ' ' << cnt2 << endl;
  return 0;
}
