#include <bits/stdc++.h>
using namespace std;
template <typename T>
double DIS(T va, T vb) {
  return sqrt((double)(va.c - vb.c) * (va.c - vb.c) +
              (va.r - vb.r) * (va.r - vb.r));
}
template <class T>
inline T INT_LEN(T v) {
  int len = 1;
  while (v /= 10) ++len;
  return len;
}
const double pi = acos(-1.);
const double Q = 1 - 2. / pi;
const int der[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int g[2005][2005];
bool vis[2005][2005], see[2005][2005];
int N, sum, area;
typedef struct {
  int r, c;
} tc;
tc q[2005 * 2005], p[4];
void input(int n) {
  int i, j;
  memset(vis, 0, sizeof(vis));
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      scanf("%d", &g[i][j]);
    }
  }
}
template <typename T>
inline double det(T a, T b, T c) {
  return (b.c - a.c) * (c.r - a.r) - (b.r - a.r) * (c.c - a.c);
}
void judge(tc *p, tc &v) {
  if (p[0].r > v.r) p[0] = v;
  if (p[0].r == v.r && p[0].c > v.c) p[0] = v;
  if (p[1].c > v.c) p[1] = v;
  if (p[1].c == v.c && p[1].r < v.r) p[1] = v;
  if (p[2].r < v.r) p[2] = v;
  if (p[2].r == v.r && p[2].c < v.c) p[2] = v;
  if (p[3].c < v.c) p[3] = v;
  if (p[3].c == v.c && p[3].r > v.r) p[3] = v;
}
int bfs(bool vis[][2005], int n, int ii, int jj, int MX) {
  int front = 0, rear = 1, i, r, c;
  int sum = 0;
  tc u, v;
  vis[ii][jj] = true;
  u.r = ii, u.c = jj;
  q[front] = u;
  judge(p, u);
  while (front != rear) {
    u = q[front++];
    if (front == MX) front = 0;
    for (i = 0; i < 4; i++) {
      r = u.r + der[i][0];
      c = u.c + der[i][1];
      if (r >= 0 && r < n && c >= 0 && c < n && !vis[r][c] && g[r][c] == 1) {
        vis[r][c] = true;
        v.r = r;
        v.c = c;
        q[rear++] = v;
        sum++;
        if (rear == MX) rear = 0;
        judge(p, v);
      }
    }
  }
  return sum;
}
int bfs2(bool vis[][2005], int n, int ii, int jj, int MX) {
  int front = 0, rear = 1, i, r, c;
  int sum = 0;
  tc u, v;
  vis[ii][jj] = true;
  u.r = ii, u.c = jj;
  q[front] = u;
  judge(p, u);
  while (front != rear) {
    u = q[front++];
    if (front == MX) front = 0;
    for (i = 0; i < 4; i++) {
      r = u.r + der[i][0];
      c = u.c + der[i][1];
      if (r >= 0 && r < n && c >= 0 && c < n && !vis[r][c] && g[r][c] == 1) {
        vis[r][c] = true;
        v.r = r;
        v.c = c;
        q[rear++] = v;
        if (det(v, p[0], p[1]) > 0) sum++;
        if (rear == MX) rear = 0;
        judge(p, v);
      }
    }
  }
  return sum;
}
void init(tc *po) {
  po[0].r = 2005, po[0].c = 2005;
  po[1].r = -1, po[1].c = 2005;
  po[2].r = -1, po[2].c = -1;
  po[3].r = 2005, po[3].c = -1;
}
void solve(int n) {
  int i, j, rectangle = 0, circle = 0;
  int MX = 2005 * 2005;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (g[i][j] && !vis[i][j]) {
        init(p);
        sum = bfs(vis, n, i, j, MX);
        int up = p[0].r;
        int lt = p[1].c;
        int down = p[2].r;
        int rt = p[3].c;
        for (int ii = up; ii <= down; ii++) {
          for (int jj = lt; jj <= rt; jj++) {
            see[ii][jj] = false;
          }
        }
        area = bfs2(see, n, i, j, MX);
        double p = 4. * area / sum;
        if (fabs(p - Q) <= 0.1)
          circle++;
        else
          rectangle++;
      }
    }
  }
  printf("%d %d\n", circle, rectangle);
}
int main(void) {
  while (~scanf("%d", &N)) {
    input(N);
    solve(N);
  }
  return 0;
}
