#include <bits/stdc++.h>
using namespace std;
const int maxn = 5001, M = 1e9 + 7;
int n, F, vis[maxn], T = 1, mid, a[maxn], b[maxn], w[maxn][maxn], ans = 1;
vector<int> g[maxn];
bool C[maxn];
bool dfs(int v) {
  vis[v] = T;
  for (int i = 0; i < g[v].size(); i++)
    if (vis[g[v][i]] != T) {
      C[g[v][i]] = !C[v];
      if (!dfs(g[v][i])) return false;
    } else if (C[g[v][i]] == C[v])
      return false;
  return true;
}
inline bool check(int x) {
  for (int i = 1; i <= n; i++) g[i].resize(0);
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
      if (w[i][j] > x) g[i].push_back(j), g[j].push_back(i);
  T++;
  for (int i = 1; i <= n; i++)
    if (vis[i] != T)
      if (!dfs(i)) return false;
  return true;
}
inline void bs(int f, int l) {
  while (f != l) {
    mid = (f + l) / 2;
    if (check(mid))
      l = mid;
    else
      f = mid + 1;
  }
  check(f);
  F = f;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d%d", a + i, b + i);
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
      w[i][j] = abs(a[i] - a[j]) + abs(b[i] - b[j]);
  bs(0, 7500);
  T++;
  ans = 1;
  for (int i = 1; i <= n; i++)
    if (vis[i] != T) dfs(i), ans = (ans << 1) % M;
  printf("%d\n%d\n", F, ans);
  return 0;
}
