#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <ctime>
#include <queue>
#include <stack>
#include <algorithm>
#include <list>
#include <vector>
#include <set>
#include <map>
#include <iostream>
#include <deque>
#include <complex>
#include <string>
#include <iomanip>
#include <sstream>
#include <bitset>
#include <valarray>
#include <unordered_map>
#include <iterator>
#include <functional>
#include <cassert>
using namespace std;
typedef long long int ll;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define REPS(i,x) for(int i=1;i<=(int)(x);i++)
#define RREP(i,x) for(int i=((int)(x)-1);i>=0;i--)
#define RREPS(i,x) for(int i=((int)(x));i>0;i--)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
#define ALL(container) (container).begin(), (container).end()
#define RALL(container) (container).rbegin(), (container).rend()
#define SZ(container) ((int)container.size())
#define mp(a,b) make_pair(a, b)
#define pb push_back
#define eb emplace_back
#define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() );

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"["; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"]"; return os;
}
template<class S, class T> ostream& operator<<(ostream &os, const map<S, T> &t) {
os<<"{"; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"}"; return os;
}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class S, class T> pair<S,T> operator+(const pair<S,T> &s, const pair<S,T> &t){ return pair<S,T>(s.first+t.first, s.second+t.second);}
template<class S, class T> pair<S,T> operator-(const pair<S,T> &s, const pair<S,T> &t){ return pair<S,T>(s.first-t.first, s.second-t.second);}

const int INF = 1<<28;
const double EPS = 1e-8;
const int MOD = 1000000007;

template<int B, int MOD=104857601, int ROOT=3> // n <= 1<<B
struct FMT{
	void transform(int *f, int N, bool inv){
		int e;
		for(e=0;;e++) if(N == (1<<e)) break;
		REP(m,N){
			int m2 = 0;
			REP(i,e) if(m&(1<<i)) m2 |= (1<<(e-1-i));
			if(m < m2) swap(f[m], f[m2]);
		}
		for(int t=0,t2=1;t2<N;t++,t2+=t2){
			vi po(1<<t);
			po[0] = 1;
			int w = mod_pow(ROOT,(MOD-1)/(2<<t),MOD);
			if(inv) w = mod_inverse(w , MOD);
			REPS(j, (1<<t)-1)
				po[j] = (ll)po[j-1]*w % MOD;

			for(int i=0;i<N;i+=t2+t2){
				for (int j = 0; j < (1<<t); j++) {
					int x = f[i+j];
					int y = (ll)f[i+t2+j] * po[j] % MOD;
					f[i+j] = x + y;
					if(f[i+j] >= MOD) f[i+j] -= MOD;
					f[i+t2+j] = x - y;
					if(f[i+t2+j] < 0) f[i+t2+j] += MOD;
				}
			}
		}
		if(inv){
			int ni=mod_inverse(N,MOD);
			for(int i = 0; i < N; i++) f[i] = (ll)f[i] * ni % MOD;
		}
	}
	template <typename T>
	vi convolution(const vector<T> &f, const vector<T> &g){
		const int n = f.size(), m = g.size();
		int n2 = 1;
		while(n2 < 2*max(f.size(), g.size())) n2 *= 2;
		vi cf(n2), cg(n2);
		REP(i, n) cf[i] = f[i];
		REP(i, m) cg[i] = g[i];
		transform(cf.data(), n2, false);
		transform(cg.data(), n2, false);
		REP(i, n2) cf[i] = (ll)cf[i] * cg[i] % MOD;
		transform(cf.data(), n2, true);
		return cf;
	}
	ll mod_pow(ll a,ll b,ll M){
		if(b==0)return 1;
		ll res=mod_pow((a*a)%M,b/2,M);
		if(b&1)res=(res*a)%M;
		return res;
	}
	inline ll mod_inverse(ll a, ll m){
	  ll b = m, u = 1, v = 0;
	  while (b) {
	    ll t = a / b;
	    swap(a -= t * b, b);
	    swap(u -= t * v, v);
	  }
	  return (u % m + m) % m;
	}
};
FMT<23> fft;

int T, n, m;

int main(int argc, char *argv[]){
	ios::sync_with_stdio(false);
	scanf("%d", &n);
	vi d(2*n*n);
	int sum = 0;
	REP(i, n)REP(j, n){
		int x; scanf("%d", &x);
		d[i*(n+n)+j] = x;
		sum += x;
	}
	vi e(RALL(d));
	auto ret = fft.convolution(d, e);
	map<int, ll> cnt;
	double dsum = 0;
	ll all = 0;
	REP(i, 2*n*n){
		int x = ret[i];
		int w = 2*n*n-1-i;
		if(w == 0){
			x -= sum;
			x /= 2;
		}
		if(x){
			int dy = w / (2*n);
			int dx = w % (2*n);
			if(dx >= n){
				dy ++;
				dx = (2*n - dx);
			}
			cnt[dx*dx+dy*dy] += x;
			all += x;
			dsum += sqrt(dx*dx+dy*dy) * x;
		}
	}
	printf("%.20f\n", dsum / all);
	int putcnt = 0;
	for(auto it : cnt){
		printf("%d %lld\n", it.first, it.second);
		if(++ putcnt == 10000) break;
	}
	return 0;
}

Measured memory_bytes: 58448