#include <bits/stdc++.h>
using namespace std;
const int maxN = 2000 + 500;
int n, m;
int a[maxN][maxN], b[maxN][maxN];
int f[maxN][maxN];
int adj[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
vector<pair<int, int> > p;
void dfs(int i, int j) {
  f[i][j] = 1;
  for (int k = 0; k < 4; k++) {
    int x = i + adj[k][0];
    int y = j + adj[k][1];
    if (a[x][y] && !f[x][y]) dfs(x, y);
  }
  p.push_back(pair<int, int>(i, j));
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 5; i < n + 5; i++)
    for (int j = 5; j < n + 5; j++) cin >> b[i][j];
  n += 12;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      int sum = 0, t = 0;
      for (int k = -2; k <= 2; k++)
        for (int l = -2; l <= 2; l++) sum += b[i + k + 5][j + l + 5], t++;
      if (sum * 2 >= t) a[i][j] = 1;
    }
  for (int i = 1; i < n - 1; i++)
    for (int j = 1; j < n - 1; j++) {
      int t = 0;
      for (int k = 0; k < 4; k++) {
        int x = i + adj[k][0];
        int y = j + adj[k][1];
        if (a[x][y] != a[i][j]) t++;
      }
      if (t == 4) a[i][j] ^= 1;
    }
  int sq = 0, ci = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] && !f[i][j]) {
        p.clear();
        dfs(i, j);
        int maxh = -1, minh = n + 1, minw = n + 1, maxw = -1;
        vector<pair<int, int> > q;
        for (int k = 0; k < p.size(); k++) {
          maxh = max(maxh, p[k].second), minh = min(minh, p[k].second),
          maxw = max(maxw, p[k].first), minw = min(minw, p[k].first);
          int border = 0;
          for (int l = 0; l < 4; l++) {
            int x = p[k].first + adj[l][0];
            int y = p[k].second + adj[l][1];
            if (!a[x][y]) border = 1;
          }
          if (border) q.push_back(p[k]);
        }
        if (maxw - minw < 10) continue;
        int best = 0, bi = 0, bj = 0;
        vector<int> dist;
        for (int i = 0; i < q.size(); i++)
          for (int j = 0; j < i; j++) {
            int dis =
                ((q[i].first - q[j].first) * (q[i].first - q[j].first)) +
                ((q[i].second - q[j].second) * (q[i].second - q[j].second));
            if (dis > best) {
              best = dis;
            }
            dist.push_back(dis);
          }
        sort(dist.begin(), dist.end(), greater<int>());
        double thre = (double)dist[0] / dist[dist.size() / 10];
        cerr << thre << endl;
        if (thre < 1.2)
          ci++;
        else
          sq++;
      }
  cout << ci << ' ' << sq << endl;
  return 0;
}
