#include <bits/stdc++.h>
using namespace std;
const int N = 55, MOD = 998244353;
inline int Add(const int &a, const int &b) {
  return a + b >= MOD ? a + b - MOD : a + b;
}
inline int Sub(const int &a, const int &b) {
  return a - b < 0 ? a - b + MOD : a - b;
}
inline int Mul(const int &a, const int &b) { return 1ll * a * b % MOD; }
inline int Pow(int a, int b) {
  int r = 1;
  while (b) {
    if (b & 1) r = Mul(r, a);
    a = Mul(a, a), b >>= 1;
  }
  return r;
}
int n, m;
int pnt[N][2], sav[N][2];
int cov[N << 1];
vector<int> tpo, uni;
struct OPT {
  int pos, le, ri, key;
  OPT() {}
  OPT(int p, int l, int r, int k) : pos(p), le(l), ri(r), key(k) {}
} Op[N << 1];
bool operator<(OPT A, OPT B) { return A.pos < B.pos; }
void Cover(int le, int ri, int key) {
  for (int i = le; i < ri; i++) cov[i] += key;
}
int SumUp(int t) {
  int ret = 0;
  for (int i = 0; i < t - 1; i++) ret += cov[i] ? uni[i + 1] - uni[i] : 0;
  return ret;
}
int Calc(int t) {
  memset(cov, 0, sizeof cov);
  uni.clear();
  for (int i = 1; i <= n; i++) {
    uni.push_back(pnt[i][1] - t);
    uni.push_back(pnt[i][1] + t + 1);
  }
  sort(uni.begin(), uni.end());
  uni.erase(unique(uni.begin(), uni.end()), uni.end());
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    Op[++cnt] = OPT(
        pnt[i][0] - t,
        (lower_bound(uni.begin(), uni.end(), pnt[i][1] - t) - uni.begin()),
        (lower_bound(uni.begin(), uni.end(), pnt[i][1] + t + 1) - uni.begin()),
        1);
    Op[++cnt] = OPT(
        pnt[i][0] + t + 1,
        (lower_bound(uni.begin(), uni.end(), pnt[i][1] - t) - uni.begin()),
        (lower_bound(uni.begin(), uni.end(), pnt[i][1] + t + 1) - uni.begin()),
        -1);
  }
  sort(Op + 1, Op + 1 + cnt);
  int ret = 0, siz = uni.size();
  for (int i = 1, las = -1e9; i <= cnt; i++) {
    int j = i, cur = Op[i].pos;
    while (j + 1 <= cnt && Op[j + 1].pos == cur) j++;
    ret = Add(ret, Mul(Sub(cur, las), SumUp(siz)));
    for (int k = i; k <= j; k++) Cover(Op[k].le, Op[k].ri, Op[k].key);
    i = j, las = cur;
  }
  return ret;
}
int ABS(int x) { return x < 0 ? -x : x; }
int Poly(int x) {
  int ret = 0;
  for (int i = 0; i < 5; i++) {
    int obv = sav[i][1], blw = 1;
    for (int j = 0; j < 5; j++)
      if (i != j) {
        obv = Mul(obv, Sub(x, sav[j][0]));
        blw = Mul(blw, Sub(sav[i][0], sav[j][0]));
      }
    ret = Add(ret, Mul(obv, Pow(blw, MOD - 2)));
  }
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d%d", &pnt[i][0], &pnt[i][1]);
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      int cur = max(ABS(pnt[i][0] - pnt[j][0]), ABS(pnt[i][1] - pnt[j][1]));
      cur = (cur - 1) / 2 + 1;
      if (cur > m) continue;
      tpo.push_back(cur);
    }
  tpo.push_back(0), tpo.push_back(m);
  sort(tpo.begin(), tpo.end());
  tpo.erase(unique(tpo.begin(), tpo.end()), tpo.end());
  int sum = 0;
  for (int i = 1, li = tpo.size(); i < li; i++) {
    int le = tpo[i - 1], ri = tpo[i] - 1;
    if (ri - le + 1 >= 5) {
      for (int k = 0; k < 5; k++) sav[k][0] = le + k, sav[k][1] = Calc(le + k);
      for (int k = 1; k < 5; k++) sav[k][1] = Add(sav[k][1], sav[k - 1][1]);
      sum = Add(sum, Poly(ri));
    } else {
      for (int k = le; k <= ri; k++) sum = Add(sum, Calc(k));
    }
  }
  sum = Add(sum, Calc(m));
  printf("%d\n", Sub(Mul(m + 1, Calc(m)), sum));
  return 0;
}
