#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& s, vector<T> const& v) {
  s << '{';
  for (int i = 0; i < int(v.size()); i++) s << (i ? "," : "") << v[i];
  return s << '}';
}
template <typename S, typename T>
ostream& operator<<(ostream& s, pair<S, T> const& p) {
  return s << '(' << p.first << ',' << p.second << ')';
}
constexpr int MAXN = 100005;
long long minSum(long long n, long long b, long long init, long long l) {
  if (b == 1) return ((n + 1) * (n + 2)) / 2 - 1;
  long long rem = n, clev = init, ans = 0;
  while (rem > 0) {
    long long use = min(rem, clev);
    rem -= use;
    ans += l * use;
    clev *= b;
    ++l;
  }
  return ans;
}
bool sv() {
  long long N, S;
  scanf("%lld%lld", &N, &S);
  long long maxBr = 1;
  while (maxBr < N && 1 + minSum(N - 1, maxBr, maxBr, 2) > S) ++maxBr;
  if (maxBr == N) return false;
  long long remN = N - 1, remS = S - 1, curlev = 2, plev = 1;
  vector<long long> layers;
  while (remN > 0) {
    long long a = 0, b = plev * maxBr;
    while (b - a > 1) {
      long long c = (a + b) / 2;
      if (minSum(remN, maxBr, c, curlev) > remS)
        a = c;
      else
        b = c;
    }
    layers.push_back(b);
    remN -= b;
    remS -= curlev * b;
    ++curlev;
    plev = b;
  }
  if (remS) return false;
  vector<int> ans(N);
  long long cur = 1;
  for (int i = 0; i < int(layers.size()); i++) {
    long long pLayer = i ? layers[i - 1] : 1;
    long long oldCur = cur;
    long long rem = layers[i];
    for (int j = oldCur - pLayer; j < int(oldCur); j++) {
      for (int k = 0; k < int(maxBr); k++) {
        if (rem > 0) {
          ans[cur] = j;
          --rem;
          ++cur;
        } else {
          goto dn;
        }
      }
    }
  dn:;
  }
  puts("Yes");
  for (int i = 1; i < int(N); i++)
    printf("%d%c", ans[i] + 1, i == N - 1 ? '\n' : ' ');
  return true;
}
int main() {
  if (!sv()) puts("No");
}
