#include <bits/stdc++.h>
inline int abs(int A) { return A > 0 ? A : -A; }
struct coor {
  int X, Y;
} T[5001];
int N, dis[5001][5001];
int vst[5001];
int avl[10001], cnt;
void count(int node, int K) {
  vst[node] = 1;
  for (int i = 0; i < N; i++)
    if (dis[node][i] > K && !vst[i]) count(i, K);
  return;
}
bool DFS(int node, int col, int K) {
  vst[node] = col;
  for (int i = 0; i < N; i++)
    if (dis[node][i] > K) {
      if (vst[i] == col) return true;
      if (!vst[i])
        if (DFS(i, 3 - col, K)) return true;
    }
  return false;
}
bool chk(int K) {
  if (K < 0) return false;
  if (avl[K]) return (avl[K] > 0) ? true : false;
  memset(vst, 0, sizeof(vst));
  for (int i = 0; i < N; i++) {
    if (!vst[i]) {
      if (DFS(i, 1, K)) {
        avl[K] = -1;
        return false;
      }
    }
  }
  avl[K] = 1;
  return true;
}
int main() {
  scanf("%d", &N);
  for (int i = 0; i < N; i++) scanf("%d%d", &T[i].X, &T[i].Y);
  for (int i = 0; i < N; i++)
    for (int j = i; j < N; j++)
      dis[i][j] = dis[j][i] = abs(T[i].X - T[j].X) + abs(T[i].Y - T[j].Y);
  int bg = 0, ed = 10000, mid;
  while (1) {
    mid = (bg + ed) / 2;
    if (chk(mid)) {
      if (!chk(mid - 1))
        break;
      else
        ed = mid - 1;
    } else
      bg = mid + 1;
  }
  memset(vst, 0, sizeof(vst));
  for (int i = 0; i < N; i++) {
    if (vst[i]) continue;
    cnt++;
    count(i, mid);
  }
  int ans = 1;
  for (int i = 0; i < cnt; i++) ans = (ans * 2) % 1000000007;
  printf("%d\n%d\n", mid, ans);
}
