#include <bits/stdc++.h>
using namespace std;
int n, d;
const int maxn = 30001;
const int maxm = 700;
int a[maxn];
const int lim = 300;
int dp[maxn][maxm];
bool can[maxn][maxm];
int& get(const int x, const int y) {
  if (d <= lim) {
    return dp[x][y];
  }
  int offset = d - lim;
  return dp[x][y - offset];
}
bool& gb(const int x, const int y) {
  if (d <= lim) {
    return can[x][y];
  }
  int offset = d - lim;
  return can[x][y - offset];
}
int solve() {
  memset(dp, 0, sizeof dp);
  get(d, d) = a[d];
  gb(d, d) = true;
  for (int i = d; i <= maxn; i++) {
    for (int j = max(d - lim, 0); j < min(d + lim, maxn); j++) {
      int cur = get(i, j);
      if (gb(i, j)) {
        if (i + j - 1 < maxn && j - 1 > 0) {
          gb(i + j - 1, j - 1) = true;
          if (get(i + j - 1, j - 1) <= cur + a[i + j - 1])
            get(i + j - 1, j - 1) = cur + a[i + j - 1];
        }
        if (i + j < maxn) {
          gb(i + j, j) = true;
          if (get(i + j, j) <= cur + a[i + j]) get(i + j, j) = cur + a[i + j];
        }
        if (i + j + 1 < maxn) {
          gb(i + j + 1, j + 1) = true;
          if (get(i + j + 1, j + 1) <= cur + a[i + j + 1])
            get(i + j + 1, j + 1) = cur + a[i + j + 1];
        }
      }
    }
  }
  int ans = 0;
  for (int i = d; i < maxn; i++) {
    for (int j = 0; j < maxm; j++) {
      if (dp[i][j] > ans) {
        ans = dp[i][j];
      }
    }
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> d;
  memset(a, 0, sizeof a);
  for (int i = 0; i < n; i++) {
    int tmp;
    cin >> tmp;
    a[tmp]++;
  }
  int ans = solve();
  cout << ans << endl;
  return 0;
}
