#include <bits/stdc++.h>
using namespace std;
long long n;
long long s;
long long pa[104008];
vector<long long> v[104008];
queue<long long> q;
long long sons[104008];
long long dep[104008];
void build(long long k) {
  memset(sons, 0, sizeof(sons));
  for (long long i = 1; i <= n; i++) v[i].clear();
  for (long long i = 2; i <= n; i++)
    pa[i] = (i + k - 2) / k, v[pa[i]].push_back(i), sons[pa[i]]++;
}
void dfs(long long x, long long p) {
  dep[x] = dep[p] + 1;
  for (long long i = 0; i < (long long)v[x].size(); i++)
    if (v[x][i] != p) dfs(v[x][i], x);
}
long long getans() {
  dfs(1, 0);
  long long ans = 0;
  for (long long i = 1; i <= n; i++) ans += dep[i];
  return ans;
}
int main() {
  cin >> n >> s;
  long long l = 1, r = n - 1;
  long long ct = -1;
  while (l <= r) {
    long long mid = (l + r) / 2;
    build(mid);
    if (getans() <= s)
      ct = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  if (ct < 0) {
    puts("No");
    exit(0);
  };
  build(ct);
  long long mostlp = n;
  long long now = getans();
  for (long long i = n - 1; i >= 1; i--) {
    if (sons[i] == 0) {
      if (now + dep[mostlp] - dep[pa[i]] <= s) {
        sons[pa[i]]--;
        now += dep[mostlp] - dep[pa[i]];
        dep[i] = dep[mostlp] + 1;
        pa[i] = mostlp;
        mostlp = i;
        sons[mostlp]++;
      } else {
        for (long long j = 1; j <= n; j++) {
          if ((sons[j] == ct or i == j) and pa[i] != j) continue;
          if (now + dep[j] - dep[pa[i]] == s) {
            now += dep[j] - dep[pa[i]];
            pa[i] = j;
            dep[i] = dep[j] + 1;
            break;
          }
        }
        break;
      }
    }
  }
  if (now < s) {
    puts("No");
    exit(0);
  };
  puts("Yes");
  for (long long i = 2; i <= n; i++) printf("%lld ", pa[i]);
  return 0;
}
