#include <bits/stdc++.h>
using namespace std;
pair<int, int> Min, Max;
int a[2012][2012];
int n;
void init() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j) scanf("%d", &a[i][j]);
}
int cnt;
bool vis[2012][2012];
void dfs(int x, int y) {
  if (x == 0 || y == 0 || x > n || y > n) return;
  if (vis[x][y] || (a[x][y] == 0)) return;
  vis[x][y] = true;
  ++cnt;
  if (x < Min.first) Min.first = x;
  if (y < Min.second) Min.second = y;
  if (x > Max.first) Max.first = x;
  if (y > Max.second) Max.second = y;
  dfs(x - 1, y);
  dfs(x + 1, y);
  dfs(x, y + 1);
  dfs(x, y - 1);
}
void Deal1() {
  int Tsqr = 0, Tcir = 0;
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if ((!vis[i][j]) && (a[i][j] == 1)) {
        Max = make_pair(0, 0), Min = make_pair(n + 1, n + 1);
        cnt = 0;
        dfs(i, j);
        if ((Max.second - Min.second + 1) * (Max.first - Min.first + 1) ==
            cnt) {
          ++Tsqr;
        } else
          ++Tcir;
      }
  cout << Tcir << ' ' << Tsqr << endl;
}
pair<int, int> cache[2012 * 10];
int Tot;
void dfs2(int x, int y) {
  if (x == 0 || y == 0 || x > n || y > n) return;
  if (vis[x][y] || (a[x][y] == 0)) return;
  vis[x][y] = true;
  ++cnt;
  if (x < Min.first) Min.first = x;
  if (y < Min.second) Min.second = y;
  if (x > Max.first) Max.first = x;
  if (y > Max.second) Max.second = y;
  dfs2(x - 1, y);
  dfs2(x + 1, y);
  dfs2(x, y + 1);
  dfs2(x, y - 1);
  if ((a[x - 1][y] == 0) || (a[x + 1][y] == 0) || (a[x][y + 1] == 0) ||
      (a[x][y - 1] == 0))
    cache[++Tot] = make_pair(x, y);
}
void Deal2() {
  int Tsqr = 0, Tcir = 0;
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if ((!vis[i][j]) && (a[i][j] == 1)) {
        Tot = 0;
        Max = make_pair(0, 0), Min = make_pair(n + 1, n + 1);
        dfs2(i, j);
        pair<double, double> mid =
            make_pair(((double)Max.first + Min.first) / 2,
                      ((double)Max.second + Min.second) / 2);
        double max = 0, min = 1e100;
        for (int i = 1; i <= Tot; ++i) {
          pair<int, int> t = cache[i];
          double p = sqrt((t.first - mid.first) * (t.first - mid.first) +
                          (t.second - mid.second) * (t.second - mid.second));
          if (p > max) max = p;
          if (p < min) min = p;
        }
        if ((max / min) >= 1.30)
          ++Tsqr;
        else
          ++Tcir;
      }
  cout << Tcir << ' ' << Tsqr << endl;
}
int main() {
  init();
  Deal2();
}
