#include <bits/stdc++.h>
using namespace std;
bool SR(int &x) { return scanf("%d", &x) == 1; }
bool SR(long long &x) { return scanf("%lld", &x) == 1; }
bool SR(double &x) { return scanf("%lf", &x) == 1; }
bool SR(char *s) { return scanf("%s", s) == 1; }
bool RI() { return true; }
template <typename I, typename... T>
bool RI(I &x, T &...tail) {
  return SR(x) && RI(tail...);
}
void SP(const int x) { printf("%d", x); }
void SP(const long long x) { printf("%lld", x); }
void SP(const double x) { printf("%.16lf", x); }
void SP(const char *s) { printf("%s", s); }
void PL() { puts(""); }
template <typename I, typename... T>
void PL(const I x, const T... tail) {
  SP(x);
  if (sizeof...(tail)) putchar(' ');
  PL(tail...);
}
const int maxn = 3e4 + 4;
int n, d;
int cnt[maxn];
void read() {
  RI(n, d);
  for (int i = 0; i < int(n); i++) {
    int x;
    RI(x);
    cnt[x]++;
  }
}
int ans;
struct H {
  int o, l, g;
  H() {}
  H(int _o, int _l, int _g) : o(_o), l(_l), g(_g) {}
};
int dp[maxn][500];
bitset<500> vis[maxn];
void upd(int o, int l, int g) {
  ans = max(ans, g);
  l = l - d + 250;
  vis[o][l] = 1;
  dp[o][l] = max(dp[o][l], g);
}
void build() {
  upd(d, d, cnt[d]);
  for (int o = 0; o < int(maxn); o++) {
    for (int z = 0; z < int(500); z++)
      if (vis[o][z]) {
        int l = z + d - 250, g = dp[o][z];
        for (int i = (o + l - 1); i <= int(o + l + 1); i++)
          if (o < i && i < maxn) upd(i, i - o, g + cnt[i]);
      }
  }
}
void sol() { PL(ans); }
int main() {
  read();
  build();
  sol();
  return 0;
}
