#include <bits/stdc++.h>
using namespace std;
static const double EPS = 1e-10;
template <typename T, typename S>
vector<T>& operator<<(vector<T>& a, S b) {
  a.push_back(b);
  return a;
}
template <typename T>
void operator>>(vector<T>& a, int b) {
  while (b--)
    if (!a.empty()) a.pop_back();
}
bool isprime(int n) {
  if (n < 2) return false;
  for (int i = 2; i * i <= n; i++)
    if (n % i == 0) return false;
  return true;
}
long long b_pow(long long x, long long n) {
  return n ? b_pow(x * x, n / 2) * (n % 2 ? x : 1) : 1ll;
}
string itos(int n) {
  stringstream ss;
  ss << n;
  return ss.str();
}
int n;
long long c[2001][2001];
long long sum[2001][2001] = {};
bool vis[2001][2001] = {};
vector<vector<complex<double> > > a;
vector<vector<complex<double> > > ww;
int dx[] = {0, 1, 0, -1};
int dy[] = {-1, 0, 1, 0};
int search(int sx, int sy) {
  stack<pair<int, int> > S;
  S.push(make_pair(sx, sy));
  a.back().push_back(complex<double>(sx, sy));
  c[sy][sx] = 0;
  while (S.size()) {
    int x = S.top().first;
    int y = S.top().second;
    S.pop();
    for (int i = 0; i < 4; i++) {
      int tx = x + dx[i];
      int ty = y + dy[i];
      if (tx < 0 || tx >= n || ty < 0 || ty >= n || !c[ty][tx]) continue;
      c[ty][tx] = 0;
      a.back().push_back(complex<double>(tx, ty));
      S.push(make_pair(tx, ty));
    }
  }
}
const double PI = acos(-1.0);
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      int a;
      cin >> a;
      c[i][j] = a;
    }
  }
  for (int _ = 0; _ < 10; _++) {
    a.clear();
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        c[i][j] *= 100;
      }
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) sum[i][j] = (j ? sum[i][j - 1] : 0) + c[i][j];
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) sum[i][j] += (i ? sum[i - 1][j] : 0);
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        int l = max(0, j - (2));
        int r = min(n - 1, j + (2));
        int u = max(0, i - (2));
        int d = min(n - 1, i + (2));
        long long res = sum[d][r] - (l ? sum[d][l - 1] : 0) -
                        (u ? sum[u - 1][r] : 0) +
                        (l && u ? sum[u - 1][l - 1] : 0);
        c[i][j] = res / ((2 * (2) + 1) * (2 * (2) + 1)) > 50;
      }
    }
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        if (c[i][j]) {
          a.push_back(vector<complex<double> >());
          search(j, i);
        }
    for (int i = 0; i < a.size(); i++) {
      for (int j = 0; j < a[i].size(); j++)
        c[(int)a[i][j].imag()][(int)a[i][j].real()] = 1;
    }
    for (int i = 0; i < a.size(); i++) {
      if (a[i].size() <= 12) a[i].clear();
    }
    a.erase(remove(a.begin(), a.end(), vector<complex<double> >()), a.end());
  }
  int sq = 0, cc = 0;
  for (int i = 0; i < a.size(); i++) {
    double xMax = -1;
    double xMin = 1e9;
    double yMax = -1;
    double yMin = 1e9;
    for (int j = 0; j < a[i].size(); j++) {
      xMax = max(a[i][j].real(), xMax);
      yMax = max(a[i][j].imag(), yMax);
      xMin = min(a[i][j].real(), xMin);
      yMin = min(a[i][j].imag(), yMin);
    }
    double x = (xMax + xMin) / 2.0;
    double y = (yMax + yMin) / 2.0;
    double h = 0.0;
    for (int j = 0; j < a[i].size(); j++) {
      h = max(h, abs(abs(complex<double>(x, y) - a[i][j])));
    }
    double rg = fabs(h * h * PI - a[i].size()) / (h * h * PI);
    if (rg < 0.1) {
      cc++;
    } else {
      sq++;
    }
  }
  cout << cc << " " << sq << endl;
}
