#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <queue>
#include <stack>
#include <list>
#include <deque>
#include <assert.h>
#include <ctime>
#include <bitset>
#include <numeric>
#include <complex>
using namespace std;

#define double long double
#define FOREACH(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define FOR(i, a, n) for (register int i = (a); i < (int)(n); ++i)
#define FORE(i, a, n) for (i = (a); i < (int)(n); ++i)
#define Size(n) ((int)(n).size())
#define all(n) (n).begin(), (n).end()
#define ll long long
#define pb push_back
#define error(x) cout << #x << " = " << (x) << endl;
#define ull unsigned long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pdd pair<double, double>
#define point complex<double>
//#define X real()
//#define Y imag()
#define X first
#define Y second
#define EPS 1e-12
//#define endl "\n"
#define pdd pair<double, double>
bool gt(double a, double b) { return a > b+EPS; }

const int MAXN = 2048;

ll dist(pll a, pll b) {
	ll x = abs(a.X-b.X)+1;
	ll y = abs(a.Y-b.Y)+1;
	return x*x+y*y;
}

int n;
int a[MAXN][MAXN], b[MAXN][MAXN];
int mark[MAXN][MAXN];
int cnt = 0;
pii start, farthest;
const int XX = 5;

void dfs(int i, int j, int c) {
	if (i < 0 || j < 0 || i >= n || j >= n || a[i][j] == 0) return;
	if (mark[i][j] != c) return;
	if (mark[i][j] == 0) cnt++;
	mark[i][j]++;
	if (dist(start, pii(i, j)) > dist(start, farthest)) farthest = pii(i, j);
	FOR(di, -XX, XX+1) FOR(dj, -XX, XX+1) dfs(i+di, j+dj, c);
}

int main() {
	ios::sync_with_stdio(false);
	cin >> n;
	FOR(i, 0, n) FOR(j, 0, n) cin >> b[i][j];
	FOR(i, 0, n) FOR(j, 0, n) {
		int on = 0, tot = 0;
		FOR(di, -XX, XX+1) FOR(dj, -XX, XX+1) if (i+di >= 0 && i+di < n && j+dj >= 0 && j+dj < n) tot++, on += b[i+di][j+dj];
		if (b[i][j] && on*2 <= tot) a[i][j] = 0; else a[i][j] = b[i][j];
	}
	memcpy(b, a, sizeof a);
	FOR(i, 0, n) FOR(j, 0, n) {
		int on = 0, tot = 0;
		FOR(di, -XX, XX+1) FOR(dj, -XX, XX+1) if (i+di >= 0 && i+di < n && j+dj >= 0 && j+dj < n) tot++, on += b[i+di][j+dj];
		if (b[i][j] == 0 && on*2 >= tot) a[i][j] = 1; else a[i][j] = b[i][j];
	}
	int square = 0, circle = 0;
	FOR(i, 0, n) FOR(j, 0, n) if (a[i][j] && mark[i][j] == 0) {
		cnt = 0;
		start = farthest = pii(i, j);
		dfs(i, j, 0);
		start = farthest;
		dfs(i, j, 1);
		if (cnt < 100) continue;
		double d = sqrt(dist(start, farthest));
		double sq = d*d/2;
		double ci = M_PI*(d/2)*(d/2);
		if (fabs(sq-cnt) < fabs(ci-cnt))
			square++;
		else
			circle++;
	}
	cout << circle << " " << square << endl;
	return 0;
}

