#include <bits/stdc++.h>
using namespace std;
const double pi = acos(0.0) * 2.0;
const double eps = 1e-12;
const int step[8][2] = {{1, 0}, {-1, 0}, {0, 1},  {0, -1},
                        {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
template <class T>
inline T abs1(T a) {
  return a < 0 ? -a : a;
}
template <class T>
inline T max1(T a, T b, T c = -1234567, T d = -1234567) {
  T ans = a > b ? a : b;
  if (c != -1234567) ans = max1(ans, c);
  if (d != -1234567) ans = max1(ans, d);
  return ans;
}
template <class T>
inline T min1(T a, T b, T c = -1234567, T d = -1234567) {
  T ans = a < b ? a : b;
  if (c != -1234567) ans = min(ans, c);
  if (d != -1234567) ans = min(ans, d);
  return ans;
}
template <class T>
inline T gcd1(T a, T b) {
  if (a < b) swap(a, b);
  if (a % b == 0) return b;
  return gcd1(b, a % b);
}
template <class T>
inline T lowb(T num) {
  return num & (-num);
}
inline int jud(double a, double b) {
  if (abs(a) < eps && abs(b) < eps)
    return 0;
  else if (abs1(a - b) / abs1(a) < eps)
    return 0;
  if (a < b) return -1;
  return 1;
}
template <typename t>
inline int jud(t a, t b) {
  if (a < b) return -1;
  if (a == b) return 0;
  return 1;
}
template <typename it, typename t1>
inline int find(t1 val, it a, int na, bool f_small = 1, bool f_lb = 1) {
  int be = 0, en = na - 1;
  if (*a <= *(a + na - 1)) {
    if (f_lb == 0)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != 1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != -1)
          en = mid;
        else
          be = mid + 1;
      }
    if (f_small && jud(*(a + be), val) == 1) be--;
    if (!f_small && jud(*(a + be), val) == -1) be++;
  } else {
    if (f_lb)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != -1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != 1)
          en = mid;
        else
          be = mid + 1;
      }
    if (!f_small && jud(*(a + be), val) == -1) be--;
    if (f_small && jud(*(a + be), val) == 1) be++;
  }
  return be;
}
inline int bitnum(unsigned long long nValue) {
  nValue = ((0xaaaaaaaaaaaaaaaaull & nValue) >> 1) +
           (0x5555555555555555ull & nValue);
  nValue = ((0xccccccccccccccccull & nValue) >> 2) +
           (0x3333333333333333ull & nValue);
  nValue = ((0xf0f0f0f0f0f0f0f0ull & nValue) >> 4) +
           (0x0f0f0f0f0f0f0f0full & nValue);
  nValue = ((0xff00ff00ff00ff00ull & nValue) >> 8) +
           (0x00ff00ff00ff00ffull & nValue);
  nValue = ((0xffff0000ffff0000ull & nValue) >> 16) +
           (0x0000ffff0000ffffull & nValue);
  nValue = ((0xffffffff00000000ull & nValue) >> 32) +
           (0x00000000ffffffffull & nValue);
  return nValue;
}
long long pow(long long n, long long m, long long mod = 0) {
  long long ans = 1;
  long long k = n;
  while (m) {
    if (m & 1) {
      ans *= k;
      if (mod) ans %= mod;
    }
    k *= k;
    if (mod) k %= mod;
    m >>= 1;
  }
  return ans;
}
const int maxn = 510;
int orig[maxn][maxn];
int d[maxn], ld, d1[maxn], ld1;
int cnt[maxn][maxn][4];
int sum[maxn][maxn];
pair<int, long long> dpmax[2][maxn][maxn];
int n, m, r;
inline void output(int arr[][maxn]) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) printf("%d ", arr[i][j]);
    printf("\n");
  }
}
inline void upd(pair<int, long long> &a, pair<int, long long> b) {
  if (a.first < b.first)
    a = b;
  else if (a.first == b.first)
    a.second += b.second;
}
int main() {
  ios_base::sync_with_stdio(0);
  scanf("%d%d%d", &n, &m, &r);
  if (r * 2 + 1 > n || r * 2 + 1 > m) {
    printf("0 0\n");
    return 0;
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) scanf("%d", orig[i] + j);
  memset(d, -1, sizeof(d));
  memset(d1, -1, sizeof(d1));
  d[0] = r;
  d[r] = 0;
  for (int i = 1; i < r; i++) {
    d[i] = d[i - 1];
    while (d[i] * d[i] + i * i > r * r) d[i]--;
  }
  for (int i = r; i < n; i++)
    for (int j = 0; j < m - 2 * r; j++) {
      cnt[i][j][0] = orig[i][j];
      for (int k = r - 1; k >= 0; k--)
        cnt[i][j][0] += orig[i - d[k]][r - k + j];
      for (int k = 1; k <= r; k++) cnt[i][j][0] += orig[i - d[k]][j + r + k];
    }
  for (int i = 0; i < n - r; i++)
    for (int j = 0; j < m - 2 * r; j++) {
      cnt[i][j][1] = orig[i][j];
      for (int k = r - 1; k >= 0; k--)
        cnt[i][j][1] += orig[i + d[k]][r - k + j];
      for (int k = 1; k <= r; k++) cnt[i][j][1] += orig[i + d[k]][j + r + k];
    }
  for (int i = 0; i < n - 2 * r; i++)
    for (int j = r; j < m; j++) {
      cnt[i][j][2] = orig[i][j];
      for (int k = r - 1; k >= 0; k--)
        cnt[i][j][2] += orig[r - k + i][j - d[k]];
      for (int k = 1; k <= r; k++) cnt[i][j][2] += orig[i + r + k][j - d[k]];
    }
  for (int i = 0; i < n - 2 * r; i++)
    for (int j = 0; j < m - r; j++) {
      cnt[i][j][3] = orig[i][j];
      for (int k = r - 1; k >= 0; k--)
        cnt[i][j][3] += orig[r - k + i][j + d[k]];
      for (int k = 1; k <= r; k++) cnt[i][j][3] += orig[i + r + k][j + d[k]];
    }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if ((i - r) * (i - r) + (j - r) * (j - r) <= r * r)
        sum[r][r] += orig[i][j];
  for (int i = r; i < n - r; i++) {
    if (i != r) sum[i][r] = sum[i - 1][r] - cnt[i - 1][0][0] + cnt[i][0][1];
    for (int j = r + 1; j < m - r; j++)
      sum[i][j] = sum[i][j - 1] - cnt[i - r][j - 1][2] + cnt[i - r][j][3];
  }
  for (int j = 0; j < m; j++) {
    dpmax[0][0][j] = make_pair(sum[0][j], 1);
    for (int i = 1; i < n; i++) {
      dpmax[0][i][j] = dpmax[0][i - 1][j];
      if (sum[i][j] > dpmax[0][i - 1][j].first)
        dpmax[0][i][j] = make_pair(sum[i][j], 1);
      else if (sum[i][j] == dpmax[0][i - 1][j].first) {
        dpmax[0][i][j] = dpmax[0][i - 1][j];
        dpmax[0][i][j].second++;
      }
    }
    dpmax[1][n - 1][j] = make_pair(sum[n - 1][j], 1);
    for (int i = n - 2; i >= 0; i--) {
      dpmax[1][i][j] = dpmax[1][i + 1][j];
      if (sum[i][j] > dpmax[1][i + 1][j].first)
        dpmax[1][i][j] = make_pair(sum[i][j], 1);
      else if (sum[i][j] == dpmax[1][i + 1][j].first) {
        dpmax[1][i][j] = dpmax[1][i + 1][j];
        dpmax[1][i][j].second++;
      }
    }
  }
  memset(d1, -1, sizeof(d1));
  for (int i = 0; i <= r * 2; i++) {
    int temp[maxn];
    memcpy(temp, d, sizeof(temp));
    d1[i] = 0;
    for (int j = i; j >= max(0, i - r); j--)
      if (temp[j] != -1) {
        temp[j] += d[i - j] + 1;
        d1[i] = max(d1[i], temp[j]);
      }
  }
  pair<int, long long> rans = make_pair(-1, -1);
  for (int i = r; i < n - r; i++)
    for (int j = r; j < m - r; j++) {
      for (int k = r; k < m - r; k++) {
        if (abs(j - k) > r * 2) {
          upd(rans, make_pair(sum[i][j] + dpmax[0][n - 1][k].first,
                              dpmax[0][n - 1][k].second));
        } else {
          if (i - d1[abs(j - k)] >= r)
            upd(rans,
                make_pair(sum[i][j] + dpmax[0][i - d1[abs(j - k)]][k].first,
                          dpmax[0][i - d1[abs(j - k)]][k].second));
          if (i + d1[abs(j - k)] < n - r)
            upd(rans,
                make_pair(sum[i][j] + dpmax[1][i + d1[abs(j - k)]][k].first,
                          dpmax[1][i + d1[abs(j - k)]][k].second));
        }
      }
    }
  if (rans.first == -1)
    printf("0 0\n");
  else
    printf("%d %I64d\n", rans.first, rans.second / 2);
  return 0;
}
