#include <bits/stdc++.h>
using namespace std;
int N;
long long S;
int parent[100010];
long long dp[100010];
int dp2[100010];
int getVS(int bc, int n) {
  int vs = 0;
  int remaining = n;
  long long coeff = 1;
  while (remaining) {
    vs += remaining;
    if (remaining < coeff)
      remaining = 0;
    else
      remaining -= coeff;
    coeff *= bc;
  }
  return vs;
}
void build(int idx, int numChild, long long ss) {
  if (numChild <= 1) return;
  if (ss == dp[numChild]) {
    for (int i = 1; i < numChild; i++) parent[idx + i] = idx + i - 1;
    return;
  }
  ss -= numChild;
  long long a;
  int lo = numChild / 2;
  int hi = numChild - 1;
  while (lo + 1 < hi) {
    int mid = (lo + hi) / 2;
    a = dp[mid] + dp[numChild - 1 - mid];
    if (a >= ss)
      hi = mid;
    else
      lo = mid;
  }
  while (hi) {
    a = dp2[hi] + dp2[numChild - 1 - hi];
    if (a <= ss) break;
    hi--;
  }
  parent[idx + 1] = idx;
  if (hi + 1 <= numChild - 1) {
    parent[idx + hi + 1] = idx;
    if (dp2[hi] <= ss - dp[numChild - 1 - hi]) {
      build(idx + 1, hi, ss - dp[numChild - 1 - hi]);
      build(idx + hi + 1, numChild - 1 - hi, dp[numChild - 1 - hi]);
    } else {
      build(idx + 1, hi, dp2[hi]);
      build(idx + hi + 1, numChild - 1 - hi, ss - dp2[hi]);
    }
  } else
    build(idx + 1, hi, ss);
}
int main() {
  scanf("%d %I64d", &N, &S);
  long long min = 2 * N - 1;
  long long max = (1LL + N) * N / 2;
  if (S < min || S > max) {
    printf("No\n");
    return 0;
  }
  if (S == max) {
    printf("Yes\n");
    for (int i = 1; i < N; i++) printf("%d ", i);
    printf("\n");
    return 0;
  }
  for (int bc = 2; bc < N; bc++) {
    int vs = getVS(bc, N);
    if (vs <= S) {
      if (bc == 2) {
        for (int i = 0; i < N; i++) dp[i] = (1LL + i) * i / 2;
        for (int i = 0; i < N; i++) dp2[i] = getVS(2, i);
        build(0, N, S);
        printf("YES\n");
        for (int i = 1; i < N; i++) printf("%d ", parent[i] + 1);
        return 0;
      } else {
        for (int i = 1; i < N; i++) parent[i] = (i - 1) / bc;
        if (vs == S) {
          printf("YES\n");
          for (int j = 1; j < N; j++) printf("%d ", parent[j] + 1);
          printf("\n");
          return 0;
        }
        while (true) {
          vector<int> f;
          int firstC = 0;
          f.push_back(firstC);
          while ((long long)firstC * bc + 1 < N) {
            firstC = firstC * bc + 1;
            f.push_back(firstC);
          }
          for (int ff : f) dp2[ff] = 1;
          for (int i = N - 1; i >= 0; i--) {
            if (dp2[i]) continue;
            int flag = 0;
            for (int ff : f) {
              if (!flag && ff <= parent[i])
                continue;
              else if (ff > parent[i])
                flag = 1;
              if (flag) {
                parent[i] = ff;
                vs++;
                if (vs == S) {
                  printf("YES\n");
                  for (int j = 1; j < N; j++) printf("%d ", parent[j] + 1);
                  printf("\n");
                  return 0;
                }
              }
            }
            f.push_back(i);
          }
        }
      }
    }
  }
  return 0;
}
