#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const long long Inf = 1e18;
const int mod = 998244353;
int gi() {
  int x = 0, o = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
template <typename T>
bool chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
};
template <typename T>
bool chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
};
int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
void inc(int &a, int b) { a = (a + b >= mod ? a + b - mod : a + b); }
void dec(int &a, int b) { a = (a - b < 0 ? a - b + mod : a - b); }
string to_string(string s) { return '"' + s + '"'; }
string to_string(const char *s) { return to_string((string)s); }
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + "," + to_string(p.second) + ")";
}
template <typename T>
string to_string(T v) {
  int fst = 1;
  string ret = "{";
  for (auto x : v) {
    if (!fst) ret += ",";
    fst = 0, ret += to_string(x);
  }
  ret += "}";
  return ret;
}
void dbg_out() { cerr << endl; }
template <typename Head, typename... Tail>
void dbg_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  dbg_out(T...);
}
const int N = 120;
int n, t, x[N], y[N], sx[N], sy[N], tx = 0, ty = 0;
int qpow(int a, int b) {
  int ret = 1;
  while (b) {
    if (b & 1) ret = 1ll * ret * a % mod;
    a = 1ll * a * a % mod, b >>= 1;
  }
  return ret;
}
int find(int *s, int t, int x) { return lower_bound(s + 1, s + t + 1, x) - s; }
vector<pair<int, int> > ins[N], del[N];
int cov[N];
int f(int t) {
  tx = ty = 0;
  for (int i = 1; i <= n; i++) {
    int x1 = x[i] - t, x2 = x[i] + t + 1, y1 = y[i] - t, y2 = y[i] + t + 1;
    sx[++tx] = x1, sx[++tx] = x2, sy[++ty] = y1, sy[++ty] = y2;
  }
  sort(sx + 1, sx + tx + 1);
  tx = unique(sx + 1, sx + tx + 1) - sx - 1;
  sort(sy + 1, sy + ty + 1);
  ty = unique(sy + 1, sy + ty + 1) - sy - 1;
  for (int i = 1; i <= ty; i++) ins[i].clear(), del[i].clear();
  for (int i = 1; i <= n; i++) {
    int x1 = x[i] - t, x2 = x[i] + t + 1, y1 = y[i] - t, y2 = y[i] + t + 1;
    x1 = find(sx, tx, x1), x2 = find(sx, tx, x2);
    y1 = find(sy, ty, y1), y2 = find(sy, ty, y2);
    ins[y1].push_back(make_pair(x1, x2));
    del[y2].push_back(make_pair(x1, x2));
  }
  memset(cov, 0, sizeof(cov));
  int ret = 0;
  for (int i = 1; i <= ty; i++) {
    if (i > 1) {
      int sum = 0;
      for (int j = 1; j < tx; j++)
        if (cov[j]) inc(sum, sub(sx[j + 1], sx[j]));
      inc(ret, 1ll * sum * sub(sy[i], sy[i - 1]) % mod);
    }
    for (auto x : ins[i])
      for (int j = x.first; j < x.second; j++) ++cov[j];
    for (auto x : del[i])
      for (int j = x.first; j < x.second; j++) --cov[j];
  }
  return ret;
}
int ip(int *a, int d, int s, int x) {
  int ret = 0;
  for (int i = 0; i <= d; i++) {
    int c = 1;
    for (int j = 0; j <= d; j++)
      if (i != j)
        c = 1ll * c * (sub(x, add(s, j))) % mod * qpow(sub(i, j), mod - 2) %
            mod;
    inc(ret, 1ll * c * a[i] % mod);
  }
  return ret;
}
int main() {
  n = gi(), t = gi();
  for (int i = 1; i <= n; i++) x[i] = gi(), y[i] = gi();
  vector<int> sec;
  sec.push_back(0);
  sec.push_back(t);
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      int u = (max(abs(x[i] - x[j]), abs(y[i] - y[j])) - 1) / 2 + 1;
      if (u <= t) sec.push_back(u);
    }
  sort(sec.begin(), sec.end());
  sec.erase(unique(sec.begin(), sec.end()), sec.end());
  int ans = 1ll * t * f(t) % mod;
  for (int i = 0; i < int(sec.size()) - 1; i++) {
    int l = sec[i], r = sec[i + 1] - 1;
    if (r - l + 1 <= 5) {
      for (int j = l; j <= r; j++) dec(ans, f(j));
    } else {
      int a[10];
      a[0] = f(l);
      for (int j = 1; j <= 3; j++) a[j] = add(a[j - 1], f(l + j));
      dec(ans, ip(a, 3, l, r));
    }
  }
  printf("%d\n", ans);
  return 0;
}
