#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;
template<class T>bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; }
//---------------------------------------------------------------------------------------------------
template<typename T, int VW, int VH> struct Ruisekiwa2D {
    T v[VH][VW];
    Ruisekiwa2D() { reset(); }
    void reset() { rep(y, 0, VH) rep(x, 0, VW) v[y][x] = 0; }
    void set(int x, int y, T c) { v[y][x] = c; }
    void build() {
        rep(y, 0, VH) rep(x, 0, VW) {
            if (0 < y) v[y][x] += v[y - 1][x];
            if (0 < x) v[y][x] += v[y][x - 1];
            if (0 < y && 0 < x) v[y][x] -= v[y - 1][x - 1];
        }
    }
    T get(int sx, int sy, int tx, int ty) {
        assert(sx <= tx && sy <= ty);
        T rs = v[ty][tx];
        if (0 < sx) rs -= v[ty][sx - 1];
        if (0 < sy) rs -= v[sy - 1][tx];
        if (0 < sx && 0 < sy) rs += v[sy - 1][sx - 1];
        return rs;
    }
};
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i
　　　　／　　　＼　 　  |　|
　　　 /　　 /￣￣￣￣/　　|
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿
　 　　　＼/＿＿＿＿/　（u　⊃
---------------------------------------------------------------------------------------------------*/







int N, D, X[101010], Y[101010];
//---------------------------------------------------------------------------------------------------
int cnt[1010][1010];
Ruisekiwa2D<int, 2010, 2010> aa, ab, bb;
int check(int r) {
    aa.reset();
    ab.reset();
    bb.reset();

    int a = r / D;
    int b = r % D;

    rep(y, 0, D * 2) rep(x, 0, D * 2) {
        int xx = x % D, yy = y % D;
        if (1LL * a * a < cnt[yy][xx]) {
            aa.set(x, y, 1);
        }
        if (1LL * a * (a + 1) < cnt[yy][xx]) {
            ab.set(x, y, 1);
        }
        if (1LL * (a + 1) * (a + 1) < cnt[yy][xx]) {
            bb.set(x, y, 1);
        }
    }
    aa.build(); ab.build(); bb.build();

    rep(sy, 0, D) rep(sx, 0, D) {
        int ok = 1;
        if (0 < b) {
            if (bb.get(sx, sy, sx + b - 1, sy + b - 1)) ok = 0;
            if (ab.get(sx, sy + b, sx + b - 1, sy + D - 1)) ok = 0;
            if (ab.get(sx + b, sy, sx + D - 1, sy + b - 1)) ok = 0;
        }
        
        if (aa.get(sx + b, sy + b, sx + D - 1, sy + D - 1)) ok = 0;
        if (ok) return 1;
    }

    return 0;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> D;
    rep(i, 0, N) cin >> X[i] >> Y[i];
    rep(i, 0, N) cnt[Y[i] % D][X[i] % D]++;

    int ng = 1, ok = inf;
    while (ng + 1 != ok) {
        int md = (ng + ok) / 2;
        if (check(md)) ok = md;
        else ng = md;
    }
    cout << ok - 1 << endl;
}


Measured memory_bytes: 52352