#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
char a[2000][2000];
bool vis[2000][2000];
int n;
vector<pair<int, int> > obj;
queue<pair<int, int> > q;
const int min_element_to_initialize = 20;
const int min_element_for_figure = 100;
bool check_init(int x, int y) {
  int count = 0;
  for (int(i) = (-3); (i) <= (3); ++(i))
    for (int(j) = (-3); (j) <= (3); ++(j))
      if (0 <= x + i && x + i < n && 0 <= y + i && y + i < n) {
        count += a[x + i][y + j];
      }
  return count >= min_element_to_initialize;
}
void all_out() {
  for (int(i) = 0; (i) < (n / 10); ++(i)) {
    for (int(j) = 0; (j) < (n / 10); ++(j)) printf("%d", a[i * 10][j * 10]);
    printf("\n");
  }
}
int main() {
  scanf("%d", &n);
  for (int(i) = 0; (i) < (n); ++(i))
    for (int(j) = 0; (j) < (n); ++(j)) {
      scanf("%d", &a[i][j]);
    }
  int ans1 = 0, ans2 = 0;
  pair<int, int> cur;
  for (int(i) = 0; (i) < (n); ++(i))
    for (int(j) = 0; (j) < (n); ++(j)) {
      if (a[i][j] && check_init(i, j))
        q.push(make_pair((i), (j)));
      else
        continue;
      obj.clear();
      long long x = 0, y = 0;
      while (!q.empty()) {
        cur = q.front();
        q.pop();
        for (int(ii) = (-2); (ii) <= (2); ++(ii))
          for (int(jj) = (-2); (jj) <= (2); ++(jj))
            if (0 <= cur.first + ii && cur.first + ii < n &&
                0 <= cur.second + jj && cur.second + jj < n &&
                a[cur.first + ii][cur.second + jj]) {
              a[cur.first + ii][cur.second + jj] = 0;
              q.push(make_pair((cur.first + ii), (cur.second + jj)));
              obj.push_back(make_pair((cur.first + ii), (cur.second + jj)));
              x += obj.back().first;
              y += obj.back().second;
            }
      }
      if (obj.size() < min_element_for_figure) break;
      x /= obj.size();
      y /= obj.size();
      long long max_dist2 = 0;
      for (int(i) = 0; (i) < int((obj).size()); ++(i))
        max_dist2 =
            max(max_dist2, ((obj[i].first - x) * (obj[i].first - x)) +
                               ((obj[i].second - y) * (obj[i].second - y)));
      double square = max_dist2 * (2 + 3.1415926) / 2;
      if (int(obj.size()) > int(square))
        ++ans1;
      else
        ++ans2;
    }
  printf("%d %d\n", ans1, ans2);
  return 0;
}
