#include <bits/stdc++.h>
using namespace std;
const int MAXN = 30001, SQ = 250, INF = 1e9 + 10;
int _dp[2 * SQ + 10][MAXN + 10];
int cnt[MAXN + 10];
inline void mxeq(int& x, const int v) { x = max(x, v); }
inline int& dp(int x, int y) { return _dp[x + SQ + 5][y]; }
int main() {
  for (int i = -SQ; i < SQ; i++)
    for (int j = 0; j < MAXN; j++) dp(i, j) = -INF;
  int n, d;
  cin >> n >> d;
  for (int i = 0; i < n; i++) {
    int p;
    cin >> p;
    cnt[p]++;
  }
  dp(0, d) = cnt[d];
  int ans = cnt[d];
  for (int j = 0; j < MAXN; j++) {
    for (int i = -SQ; i < SQ; i++) {
      int len = d + i;
      if (len > 0 && j + len < MAXN) {
        mxeq(dp(i, j + len), dp(i, j) + cnt[j + len]);
      }
      if (len > 1 && j + len - 1 < MAXN) {
        mxeq(dp(i - 1, j + len - 1), dp(i, j) + cnt[j + len - 1]);
      }
      if (len + 1 > 0 && j + len + 1 < MAXN) {
        mxeq(dp(i + 1, j + len + 1), dp(i, j) + cnt[j + len + 1]);
      }
      mxeq(ans, dp(i, j));
    }
  }
  cout << ans << endl;
  return 0;
}
