#include <bits/stdc++.h>
using namespace std;
const int mo = 998244353;
int power(int x, int y) {
  int s = 1;
  for (; y; y /= 2, x = 1ll * x * x % mo)
    if (y & 1) s = 1ll * s * x % mo;
  return s;
}
const int N = 105;
int n, t, spe[N * N];
int x[N], y[N], X[N], Y[N];
struct que {
  int l, r, v;
};
vector<que> Q[N];
int cnt[N];
int calc(int T) {
  int ans = 0;
  *X = *Y = 0;
  for (int i = (int)(1); i <= (int)(N - 1); i++) Q[i].resize(0);
  memset(cnt, 0, sizeof(cnt));
  ;
  for (int i = (int)(1); i <= (int)(n); i++) {
    X[++*X] = x[i] - T;
    X[++*X] = x[i] + T + 1;
    Y[++*Y] = y[i] - T;
    Y[++*Y] = y[i] + T + 1;
  }
  sort(X + 1, X + *X + 1);
  sort(Y + 1, Y + *Y + 1);
  *X = unique(X + 1, X + *X + 1) - X - 1;
  *Y = unique(Y + 1, Y + *Y + 1) - Y - 1;
  for (int i = (int)(1); i <= (int)(n); i++) {
    int p1 = lower_bound(Y + 1, Y + *Y + 1, y[i] - T) - Y;
    int p2 = lower_bound(Y + 1, Y + *Y + 1, y[i] + T + 1) - Y - 1;
    Q[lower_bound(X + 1, X + *X + 1, x[i] - T) - X].push_back((que){p1, p2, 1});
    Q[lower_bound(X + 1, X + *X + 1, x[i] + T + 1) - X].push_back(
        (que){p1, p2, -1});
  }
  for (int i = (int)(1); i <= (int)((*X) - 1); i++) {
    for (auto j : Q[i])
      for (int k = (int)(j.l); k <= (int)(j.r); k++) cnt[k] += j.v;
    int sum = 0;
    for (int k = (int)(1); k <= (int)((*Y) - 1); k++)
      if (cnt[k]) sum += Y[k + 1] - Y[k];
    ans = (ans + 1ll * sum * (X[i + 1] - X[i])) % mo;
  }
  return ans;
}
int val[10], f[10], poly[10];
int main() {
  scanf("%d%d", &n, &t);
  spe[++*spe] = -1;
  spe[++*spe] = t - 1;
  for (int i = (int)(1); i <= (int)(n); i++) scanf("%d%d", &x[i], &y[i]);
  for (int i = (int)(1); i <= (int)(n); i++)
    for (int j = (int)(i + 1); j <= (int)(n); j++) {
      int val = (max(abs(x[i] - x[j]), abs(y[i] - y[j])) + 1) / 2;
      if (val < t) spe[++*spe] = val - 1;
    }
  sort(spe + 1, spe + *spe + 1);
  *spe = unique(spe + 1, spe + *spe + 1) - spe - 1;
  int ans = 1ll * t * calc(t) % mo;
  for (int l = (int)(2); l <= (int)(*spe); l++) {
    memset(val, 0, sizeof(val));
    ;
    int st = spe[l - 1] + 1, ed = min(st + 3, spe[l]), len = ed - st;
    for (int j = (int)(st); j <= (int)(ed); j++) val[j - st] = calc(j);
    for (int j = (int)(1); j <= (int)(3); j++)
      val[j] = (val[j] + val[j - 1]) % mo;
    memset(poly, 0, sizeof(poly));
    ;
    for (int i = (int)(0); i <= (int)(3); i++) {
      int tmp = 1;
      for (int j = (int)(0); j <= (int)(3); j++)
        if (i != j) tmp = 1ll * tmp * (i + mo - j) % mo;
      int v = 1ll * val[i] * power(tmp, mo - 2) % mo;
      memset(f, 0, sizeof(f));
      ;
      f[0] = 1;
      for (int j = (int)(0); j <= (int)(3); j++)
        if (i != j) {
          for (int k = (int)(3); k >= (int)(1); k--)
            f[k] = (1ll * f[k] * (mo - j) + f[k - 1]) % mo;
          f[0] = 1ll * f[0] * (mo - j) % mo;
        }
      for (int j = (int)(0); j <= (int)(3); j++)
        poly[j] = (poly[j] + 1ll * v * f[j]) % mo;
    }
    len = spe[l] - st;
    ans = (ans + mo - poly[0]) % mo;
    ans = (ans + mo - 1ll * len * poly[1] % mo) % mo;
    ans = (ans + mo - 1ll * len * len % mo * poly[2] % mo) % mo;
    ans = (ans + mo - 1ll * len * len % mo * len % mo * poly[3] % mo) % mo;
  }
  printf("%d\n", ans);
}
