#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T Max(T a, T b) {
  return a > b ? a : b;
}
template <typename T>
inline T Min(T a, T b) {
  return a < b ? a : b;
}
const double PI = acos(-1.0);
int N, D, num[30005], X, dp[30005][600];
void work() {
  int res = 0;
  memset(dp, -1, sizeof(dp));
  memset(num, 0, sizeof(num));
  for (int i = 1; i <= N; i++) {
    scanf("%d", &X);
    num[X]++;
  }
  res = dp[D][300] = num[D];
  for (int i = D; i <= 30000; i++) {
    for (int j = 0; j <= 600; j++) {
      int add = D + (j - 300);
      if (add < 1 || dp[i][j] == -1) continue;
      res = Max(res, dp[i][j]);
      if (i + add <= 30000) {
        dp[i + add][j] = Max(dp[i + add][j], dp[i][j] + num[i + add]);
      }
      if (i + add + 1 <= 30000) {
        dp[i + add + 1][j + 1] =
            Max(dp[i + add + 1][j + 1], dp[i][j] + num[i + add + 1]);
      }
      if (i + add - 1 <= 30000) {
        dp[i + add - 1][j - 1] =
            Max(dp[i + add - 1][j - 1], dp[i][j] + num[i + add - 1]);
      }
    }
  }
  cout << res << endl;
}
int main() {
  while (scanf("%d %d", &N, &D) != EOF) {
    work();
  }
  return 0;
}
