#include <stdio.h>
#include <iostream>
#include <math.h>
#include <queue>

using namespace std;

int mem[32][32][32][32];//mem[a][b][c][d]はarray[a][b]->array[c][d]の最大領域数を記録
int mem2[32][32][32][32];//mem2[a][b][c][d]はarray[a][b]->array[c][d]の最大領域数時の最小需要量の最大を記録

//指定の間の配列の合計を返す
int sumOfMatrix(int a[32][32],int sx,int sy,int tx,int ty){
	int res=0;
	for(int i=sy;i<ty;i++){
		for(int j=sx;j<tx;j++){
			res+=a[i][j];
		}
	}

	return res;
}
//デバッグ用の配列表示
void viewMatrix(int a[32][32],int sx,int sy,int tx,int ty){
	int res=0;
	for(int i=sy;i<ty;i++){
		for(int j=sx;j<tx;j++){
			printf("%3d ",a[i][j]);
		}
		cout << endl;
	}
}

//再帰的に探索する．a[sy][sx]->a[ty][tx]の最大分割数とそのときの最小の使用量の最大のペアを出力
pair<int,int> solve(int a[32][32],int sx,int sy,int tx,int ty,int sum, int sval){
	pair<int,int> p;
	pair<int,int> pls[4];
	pair<int,int> mp1,mp2;
	
	//出力するpを，領域数を1，その領域の使用量として初期化する．
	p.first = 1;
	p.second = sumOfMatrix(a,sx,sy,tx,ty);

	//plsというペア配列を初期化
	for(int i=0;i<4;i++){
		pls[i].first=0;
		pls[i].second=10000;//使用料は十分大きい値とする．
	}
	//mp1,mp2の領域数を０で初期化
	mp1.first=0;
	mp2.first=0;

	//mp1には横(xに対して)に割った場合の最大値
	//mp2には縦(yに対して)に割った場合の最大値
	//ｘ方向に二つ以上に分割できるなら
	if((tx-sx)>1){
		//sx->x,x+1->txに分割する．
		for(int x=sx;x<tx;x++){

			//分割した先の二つの領域ともに供給量制約を満たすなら
			if((sumOfMatrix(a,sx,sy,x+1,ty)>=sval)&&(sumOfMatrix(a,x+1,sy,tx,ty)>=sval)){

				//sx->x+1に割った方について
				//メモを確認して探索済みかどうかをチェックする．
				if(mem[sx][sy][x+1][ty]==0){//探索していないなら
					pls[0]=solve(a,sx,sy,x+1,ty,sum,sval);//sx->x+1に割った方の値をpls[0]に代入する

					mem[sx][sy][x+1][ty]=pls[0].first;//メモに値を与えて，次に探索する場合はこちらを参照するようにする．
					mem2[sx][sy][x+1][ty]=pls[0].second;//その時の最小の最大値をmem2にもメモする．
				}else{
					//メモがあるならばメモの値を与える．
					pls[0].first=mem[sx][sy][x+1][ty];
					pls[0].second=mem2[sx][sy][x+1][ty];
				}

				//x+1->txに割った方についても同様にする．
				if(mem[x+1][sy][tx][ty]==0){
					pls[1]=solve(a,x+1,sy,tx,ty,sum,sval);

					mem[x+1][sy][tx][ty]=pls[1].first;
					mem2[x+1][sy][tx][ty]=pls[1].second;
				}else{
					pls[1].first=mem[x+1][sy][tx][ty];
					pls[1].second=mem2[x+1][sy][tx][ty];
				}
			}
			//元の大きさに対して，今での割り方のなかで最大なものと今回割った場合の値を比較する．
			if(mp1.first<(pls[0].first+pls[1].first)){
				mp1.first=pls[0].first+pls[1].first;//今までより大きいなら領域数を更新
				mp1.second=min(pls[0].second,pls[1].second);//その場合は小さい方の需要量を与える．
			}
			if(mp1.first==(pls[0].first+pls[1].first)){//もし値が同じなら，pls[0]と[1]の小さい方と今までとを比較して”大きい方”を選ぶ
				mp1.second=max(mp1.second,min(pls[0].second,pls[1].second));
			}


		}
	}
	//ｙについても同じ事をする．
	if((ty-sy)>1){
		for(int y=sy;y<ty;y++){
			if((sumOfMatrix(a,sx,sy,tx,y+1)>=sval)&&(sumOfMatrix(a,sx,y+1,tx,ty)>=sval)){
				if(mem[sx][sy][tx][y+1]==0){
					pls[2]=solve(a,sx,sy,tx,y+1,sum,sval);

					mem[sx][sy][tx][y+1]=pls[2].first;
					mem2[sx][sy][tx][y+1]=pls[2].second;
				}else{
					pls[2].first=mem[sx][sy][tx][y+1];
					pls[2].second=mem2[sx][sy][tx][y+1];
				}
				if(mem[sx][y+1][tx][ty]==0){
					pls[3]=solve(a,sx,y+1,tx,ty,sum,sval);

					mem[sx][y+1][tx][ty]=pls[3].first;
					mem2[sx][y+1][tx][ty]=pls[3].second;
				}else{
					pls[3].first=mem[sx][y+1][tx][ty];
					pls[3].second=mem2[sx][y+1][tx][ty];
				}
			}
			if(mp2.first<(pls[2].first+pls[3].first)){
				mp2.first=pls[2].first+pls[3].first;
				mp2.second=min(pls[2].second,pls[3].second);
			}
			if(mp2.first==(pls[2].first+pls[3].first)){
				mp2.second=max(mp2.second,min(pls[2].second,pls[3].second));
			}
		}
	}

	//xに割ったものの分割数の最大値と，yに割ったものの分割数の最大値を比較する．
	if((mp1.first) > (mp2.first)){//mp1>mp2ということはmp[1,2]!=0
		p.first=mp1.first;
		p.second=mp1.second;
	}
	else{
		//最小値が一緒の場合は需要量ができるだけ大きい方をえらぶ
		if((mp1.first) == (mp2.first)){
			mp2.second=max(mp1.second,mp2.second);
		}
		//上の条件式ではmp2も0の可能性があるので，確認する.
		if(mp2.first!=0){//mpが0じゃない＝ということは1度は再起しているので
			p.first=mp2.first;
			p.second=mp2.second;
		}
	}
	//上のifに引っかからなかったということはそれは再起の底だから最初に設定したpをそのまま出力する．

	return p;
}


int main(void){
	int h,w,s;

	int table[32][32];

	int sum;
	int sval;

	pair<int,int> res;

	while(true){
		//データを初期化
		for(int i=0;i<32;i++){
			for(int j=0;j<32;j++) table[i][j]=-1;
		}
		//メモの初期化
		for(int i=0;i<32;i++){
			for(int j=0;j<32;j++){
				for(int k=0;k<32;k++){
					for(int l=0;l<32;l++){
						mem[i][j][k][l]=0;
						mem2[i][j][k][l]=0;
					}
				}
			}
		}
		
		//hを入力
		cin >> h;
		if(h==0) break;
		cin >> w;
		cin >> s;
		sum=0;
		//tableに入力
		for(int i=0;i<h;i++){
			for(int j=0;j<w;j++){
				cin >> table[i][j];
				sum+=table[i][j];
			}
		}
		//svalは許容する最大需要量（ようするに需要量の合計から供給量を引いた数）
		sval=sum-s;

		res=solve(table,0,0,w,h,sum,sval);	
		
		cout << res.first << " " << (res.second-sval) << endl;

	}
	return 0;
}

Measured memory_bytes: 9376