#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
const long long inf = 1e9 + 7;
const long long INF = 1e18 + 5;
const long long maxn = 5e5 + 5;
long long n = 100000000000, a[1555555], o[1055555], mx = 0;
long long u[1511111], b[1100005], sum, cnt, l[555555];
int c[555555];
long long bi(long long x, long long y) {
  if (y == 0) return 1ll;
  if (y == 1) return x;
  long long z = bi(x, y / 2);
  z = z * z % n;
  if (y & 1) z = z * x % n;
  return z % n;
}
vector<int> g[555555], v, vv, ve, gg[555555], gr[555555], gi[555555];
long long ti, tin[555555], fup[555555], x[555555], y[555555], used[555555];
unordered_map<int, int> dp[33333];
int main() {
  cin.tie(0);
  cout.tie(0);
  ios_base::sync_with_stdio(NULL);
  int n, d;
  cin >> n >> d;
  for (int i = 1; i <= n; i++) cin >> a[i], c[a[i]]++;
  dp[d][d] = c[d];
  int sum = dp[d][d];
  for (int i = 1; i <= 30000; i++)
    for (auto to : dp[i]) {
      int v = to.second;
      int l = to.first;
      if (l + i <= 30000) dp[i + l][l] = max(dp[i + l][l], v + c[i + l]);
      if (i + l - 1 <= 30000 && l > 1)
        dp[i + l - 1][l - 1] = max(dp[i + l - 1][l - 1], v + c[i + l - 1]);
      if (i + l + 1 <= 30000)
        dp[i + l + 1][l + 1] = max(dp[i + l + 1][l + 1], v + c[i + l + 1]);
      sum = max(sum, v);
    }
  cout << sum;
  return 0;
}
