#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void smn(T &a, const T &b) {
  if (b < a) a = b;
}
template <class T>
inline void smx(T &a, const T &b) {
  if (b > a) a = b;
}
template <class T>
inline T rev(const T &a) {
  T _ = a;
  reverse(_.begin(), _.end());
  return _;
}
const double eps = 1e-9;
const long double leps = 1e-14;
const int MN = 5000 + 100, MOD = 1000 * 1000 * 1000 + 7;
vector<int> dis;
int n;
int dt[MN][MN];
pair<int, int> point[MN];
int mk = 1, now;
int mark[MN];
int v[MN];
int d(pair<int, int> a, pair<int, int> b) {
  return abs(a.first - b.first) + abs(a.second - b.second);
}
void dfs(int a) {
  mark[a] = mk;
  for (int i = 0; i < n; i++)
    if (dt[a][i] > now && mark[i] != mk) v[i] = 1 - v[a], dfs(i);
}
bool av(int a) {
  now = a;
  for (int i = 0; i < n; i++)
    if (mark[i] != mk) v[i] = 0, dfs(i);
  mk++;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (dt[i][j] > now && v[i] == v[j]) return 0;
  return 1;
}
int main(int argc, char *argv[]) {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 0; i < n; i++) cin >> point[i].first >> point[i].second;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) dt[i][j] = d(point[i], point[j]);
  int s = 0, e = 10000;
  int res = 10000;
  while (s <= e) {
    int m = (s + e) / 2;
    if (av(m))
      smn(res, m), e = m - 1;
    else
      s = m + 1;
  }
  now = res;
  cout << now << '\n';
  int rn = 1;
  for (int i = 0; i < n; i++)
    if (mark[i] != mk) dfs(i), rn = (2LL * rn) % MOD;
  cout << rn << '\n';
  return 0;
}
