{
ID:xpycc1
PROG:range
LANG:PASCAL
}

program range;
const
	maxn=250;
var
	n:integer;
	sum:array[0..maxn,0..maxn]of word;
	ans:array[1..maxn]of word;
// 越来越有星牛的注释风格了,我喜欢这个风格
procedure iniz;
var
	i,j,t:integer;
	c:char;
begin
	assign(input,'range.in'); reset(input);
	readln(n);
	for i:=1 to n do        //预处理数组sum
	begin
		t:=0;
		for j:=1 to n do
		begin
			read(c);
			if c='1'then inc(t);
			sum[j,i]:=sum[j,i-1]+t; //在这里高兴了半天,以为状态转移学得很好
		end;
		readln;
	end;
	close(input);
end;
//
function min(x,y:integer):integer;
begin
	if x<y then min:=x
	else min:=y;
end;
//
procedure main;
var
	i,j,m,k:integer;
begin
	for i:=0 to n-2 do
		for j:=0 to n-2 do
		begin
			m:=min(n-i,n-j);
			for k:=2 to m do
				//判断
				if sum[j+k,i+k]+sum[j,i]-sum[j+k,i]-sum[j,i+k]=sqr(k) then
					inc(ans[k])
				else break;
		end;
end;
//
procedure print;
var
	i:integer;
begin
	assign(output,'range.out'); rewrite(output);
	for i:=2 to n do
		if ans[i]>0 then writeln(i,' ',ans[i])
		else break;
	close(output);
end;
//
begin
	iniz;
	main;
	print;
end.