#include <bits/stdc++.h>
int cnt[100005];
int p[100005];
int stack[100005];
int keep[100005];
int out[100005];
long long min(long long a, long long b) { return a > b ? b : a; }
void build(int n, int k) {
  p[1] = -1;
  int top = 0;
  keep[1] = 1;
  stack[++top] = 1;
  int id = 2;
  for (int i = 2; i <= n; i++) {
    if (cnt[i] == 0) break;
    int nid = id + cnt[i] - 1;
    for (int u = id; u <= nid; u++) {
      if (out[stack[top]] == k) top--;
      out[stack[top]]++;
      p[u] = stack[top];
    }
    for (int u = id; u <= nid; u++) {
      out[u] = 0;
      stack[++top] = u;
    }
    id = nid + 1;
  }
}
int main() {
  int n;
  long long s;
  scanf("%d%lld", &n, &s);
  int k = -1;
  for (int i = 1; i <= n - 1; i++) {
    long long offer = 0;
    long long left = n, depth = 1, layer = 1;
    while (left != 0) {
      long long minus = min(left, layer);
      offer += minus * depth;
      left -= minus, layer *= (long long)i, depth++;
    }
    if (offer <= s) {
      k = i;
      break;
    }
  }
  long long maxn = (long long)n * (long long)(n + 1) / 2;
  if (k == -1 || s > maxn)
    printf("No\n");
  else {
    for (int i = 1; i <= n; i++) cnt[i] = 1;
    long long left = (long long)n * (long long)(n + 1) / 2 - s;
    int down = n, up = 2;
    while (left != 0) {
      long long offer = down - up;
      if (offer >= left) {
        int t = down - left;
        cnt[t]++;
        cnt[down]--;
        left = 0;
      } else {
        left -= offer;
        cnt[down]--;
        cnt[up]++;
        if (cnt[down] == 0) down--;
        if (cnt[up] == cnt[up - 1] * k) up++;
      }
    }
    build(n, k);
    printf("Yes\n");
    for (int i = 2; i <= n; i++) printf("%d ", p[i]);
    printf("\n");
  }
  return 0;
}
