#include <bits/stdc++.h>
const int N = 30000 + 5;
int count[N], n, m;
int limit[N], milit[N];
std::vector<int> dp[N];
std::vector<int> pd[N];
inline void toMax(int &a, int b) {
  if (a < b) a = b;
}
int work() {
  for (int i = 1; i < N; ++i) {
    int l = 1, r = 30000;
    while (l <= r) {
      int mid = l + r >> 1;
      if (mid * mid > i + i)
        r = mid - 1;
      else
        l = mid + 1;
    }
    limit[i] = std::min(l - 1, m - 1);
    dp[i].resize(limit[i] + 1, -1);
    milit[i] = l - 1;
    pd[i].resize(milit[i] + 1, -1);
  }
  dp[m][0] = count[m];
  for (int i = m; i < 30000; ++i) {
    toMax(dp[i][0], pd[i][0]);
    toMax(pd[i][0], dp[i][0]);
    for (int j = 0; j <= limit[i]; ++j) {
      if (dp[i][j] != -1) {
        if (i + m - j < N && limit[i + m - j] >= j)
          toMax(dp[i + m - j][j], dp[i][j] + count[i + m - j]);
        if (j + 1 < m && i + m - j - 1 < N && limit[i + m - j - 1] >= j + 1)
          toMax(dp[i + m - j - 1][j + 1], dp[i][j] + count[i + m - j - 1]);
        if (j > 0 && i + m - j + 1 < N && limit[i + m - j + 1] >= j - 1)
          toMax(dp[i + m - j + 1][j - 1], dp[i][j] + count[i + m - j + 1]);
      }
    }
    for (int j = 0; j <= milit[i]; ++j) {
      if (pd[i][j] != -1) {
        if (i + m + j < N && milit[i + m + j] >= j)
          toMax(pd[i + m + j][j], pd[i][j] + count[i + m + j]);
        if (j > 0 && i + m + j - 1 < N && milit[i + m + j - 1] >= j - 1)
          toMax(pd[i + m + j - 1][j - 1], pd[i][j] + count[i + m + j - 1]);
        if (i + m + j + 1 < N && milit[i + m + j + 1] >= j + 1)
          toMax(pd[i + m + j + 1][j + 1], pd[i][j] + count[i + m + j + 1]);
      }
    }
  }
  int ret = 0;
  for (int i = 0; i < N; ++i)
    for (int j = 0; j < dp[i].size(); ++j) toMax(ret, dp[i][j]);
  for (int i = 0; i < N; ++i)
    for (int j = 0; j < pd[i].size(); ++j) toMax(ret, pd[i][j]);
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    int x;
    scanf("%d", &x);
    count[x]++;
  }
  printf("%d\n", work());
  return 0;
}
