#include <bits/stdc++.h>
using namespace std;
const int N = 5000 + 5;
const int MOD = 1000000007;
bool v[N];
int n, h, num, part;
int x[N], y[N], f[N], g[N], d[N];
struct Edge {
  short int a, b;
  Edge() {}
  Edge(short int a, short int b) : a(a), b(b) {}
};
vector<Edge> q[10001];
vector<short int> e[N];
int Get(int x) {
  if (f[x] == x) return x;
  int t = f[x];
  f[x] = Get(f[x]), g[x] ^= g[t];
  return f[x];
}
void Dfs(int x) {
  v[x] = 1;
  for (int i = 0; i < e[x].size(); ++i)
    if (!v[e[x][i]]) Dfs(e[x][i]);
  d[++num] = x;
}
void Dfsr(int x) {
  v[x] = 1;
  for (int i = 0; i < e[x].size(); ++i)
    if (!v[e[x][i]]) Dfsr(e[x][i]);
}
void Work() {
  for (int i = 1; i <= n; ++i)
    if (!v[i]) Dfs(i);
  for (int i = 1; i <= n; ++i) v[i] = 0;
  for (int i = n; i >= 1; --i)
    if (!v[d[i]]) {
      Dfsr(d[i]);
      part++;
    }
}
int Pow(long long x, int k) {
  long long z = 1;
  for (; k; k >>= 1, (x *= x) %= MOD)
    if (k & 1) (z *= x) %= MOD;
  return z;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d %d", &x[i], &y[i]);
  for (int i = 1; i <= n; ++i)
    for (int j = i + 1; j <= n; ++j)
      q[abs(x[i] - x[j]) + abs(y[i] - y[j])].push_back(Edge(i, j));
  for (int i = 1; i <= n; ++i) f[i] = i;
  int k;
  for (k = 10000; k >= 1; --k) {
    for (int i = 0; i < q[k].size(); ++i) {
      int fa = Get(q[k][i].a), fb = Get(q[k][i].b);
      if (fa != fb) {
        f[fa] = fb;
        g[fa] = g[q[k][i].a] ^ g[q[k][i].b] ^ 1;
      } else {
        if (g[q[k][i].a] ^ g[q[k][i].b])
          ;
        else
          goto end;
      }
    }
    for (int i = 0; i < q[k].size(); ++i) {
      e[q[k][i].a].push_back(q[k][i].b);
      e[q[k][i].b].push_back(q[k][i].a);
    }
  }
end:
  Work();
  printf("%d\n%d\n", k, Pow(2, part));
  return 0;
}
