#include <bits/stdc++.h>   using namespace std;   const int MAX_N = 20001;   const int MAX_LOG = 20;   using ll = long long;   using pii = pair<int, int>;   using pil = pair<int, ll>;   using pll = pair<ll, ll>;   const double delta = 1e-6;   const long long mod = 1e9 + 7;   const int magic_const = 1e9;   const ll INF = 2e18 + 2;   const ll BIG_DT = 1e12;   mt19937 gen(54323244234);   inline ll modoper(ll x) { return ((x % mod) + mod) % mod; }   ll gcd(ll x, ll y) { return y == 0 ? x : gcd(y, x % y); }   inline ll get_rand(ll x) { return (gen() % x + x) % x; }   template <typename T>   inline void sort(vector<T>& x) {     sort(x.begin(), x.end());   }   template <typename T>   inline void reverse(vector<T>& x) {     reverse(x.begin(), x.end());   }   template <typename T>   inline void set_max(T& x, T y) {     x = max(x, y);   }   template <typename T>   inline void set_min(T& x, T y) {     x = min(x, y);   }   ll bin_pow(ll x, ll pow) {     if (pow == 0) return 1;     if ((pow & 2) == 1) {       return (bin_pow(x, pow - 1) * x) % mod;     } else {       auto tmp = bin_pow(x, pow / 2);       return (tmp * tmp) % mod;     }   }   struct fenwick_tree {     vector<int> a;     fenwick_tree(int n) : a(n + 2) {}     void add(int pos, int delta) {       for (pos++; pos < a.size(); pos += pos & -pos) a[pos] += delta;     }     int get_sum(int pos) {       int sum = 0;       for (pos++; pos > 0; pos -= pos & -pos) sum += a[pos];       return sum;     }   };   vector<double> ys(MAX_N);   vector<vector<double>> matrix(3, vector<double>(3));   double find_det() {     double answer = 0.0;     for (int i = 0; i < 3; i++) {       double pr = 1.0;       for (int j = 0; j < 3; j++) {         pr *= matrix[j][(i + j) % 3];       }       answer += pr;     }     for (int i = 0; i < 3; i++) {       double pr = 1.0;       for (int j = 0; j < 3; j++) {         pr *= matrix[j][(i - j + 3) % 3];       }       answer -= pr;     }     return answer;   }   void set_point_in_vector(vector<double>& a, int x) {     a[0] = x * x;     a[1] = x;     a[2] = 1.0;   }   void nullify(int x1, int x2, int x3) {     set_point_in_vector(matrix[0], x1);     set_point_in_vector(matrix[1], x2);     set_point_in_vector(matrix[2], x3);   }   void set_st_r(int x1, int x2, int x3, int column) {     nullify(x1, x2, x3);     matrix[0][column] = ys[x1];     matrix[1][column] = ys[x2];     matrix[2][column] = ys[x3];   }   pair<double, pair<double, double>> find_eq(int x1, int x2, int x3) {     nullify(x1, x2, x3);     double det = find_det();     set_st_r(x1, x2, x3, 0);     double det_1 = find_det();     set_st_r(x1, x2, x3, 1);     double det_2 = find_det();     set_st_r(x1, x2, x3, 2);     double det_3 = find_det();     return {det_1 / det, {det_2 / det, det_3 / det}};   }   void solve() {     int n, d;     cin >> n >> d;     vector<int> a(n, 1);     int sum_now = (n * (n - 1)) / 2 - d;     for (int l = 1, r = a.size() - 1; l < r; r--) {       while (l < r && (sum_now - r + l < 0 || a[l] == a[l - 1] * 2)) {         l++;       }       if (l >= r) break;       sum_now -= r;       sum_now += l;       a[l]++;       a[r]--;     }     if (sum_now != 0) {       cout <<  NO n ;       return;     }     cout <<  YES n ;     a.insert(a.begin(), 0);     vector<int> pref_sums = a;     for (int i = 1; i < pref_sums.size(); i++) {       pref_sums[i] += pref_sums[i - 1];     }     for (int i = 2; i < pref_sums.size(); i++) {       for (int k = 0; k < a[i]; k++) {         cout << pref_sums[i - 2] + 1 + k / 2 <<    ;       }     }     cout <<   n ;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     srand(23321);     int t = 1;     cin >> t;     for (int i = 0; i < t; i++) solve();     return 0;   }