// Authored by Ibrahimfostok...
// Next level : "Master"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
// const ll mod = 1e9 + 7;
#define gcd __gcd
#define int ll
#define ld long double
#define lcm(a, b) (a * b / gcd(a, b))
#define ceil(x, y) (((x) + (y) - 1ll) / (y))
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define MOD(x) x = ((x % mod) + mod) % mod
const long double pi = 3.14159265358979323846;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll rand(ll L, ll R)
{
return uniform_int_distribution<ll>(L, R)(rng);
}
//
int s = 1e6;
vector<int> T;
void update(int i, int val, int x = 1, int l = 1, int r = s)
{
if (i < l || r < i)
return;
if (l == r)
{
T[x] = val;
return;
}
int mid = (l + r) / 2;
update(i, val, x * 2, l, mid);
update(i, val, x * 2 + 1, mid + 1, r);
T[x] = T[x * 2] + T[x * 2 + 1];
}
int query(int i, int j, int x = 1, int l = 1, int r = s)
{
if (r < i || j < l)
return 0;
if (i <= l && r <= j)
return T[x];
int mid = (l + r) / 2;
int q1 = query(i, j, 2 * x, l, mid);
int q2 = query(i, j, 2 * x + 1, mid + 1, r);
return q1 + q2;
}
vector<int> minp, primes;
void sieve(int n)
{
minp.assign(n + 1, 0);
primes.clear();
for (int i = 2; i <= n; i++)
{
if (minp[i] == 0)
{
minp[i] = i;
primes.push_back(i);
}
for (auto p : primes)
{
if (i * p > n)
{
break;
}
minp[i * p] = p;
if (p == minp[i])
{
break;
}
}
}
}
void My_Solve(int TC)
{
// cout << setprecision(10) << fixed;
int n;
cin >> n;
vector<int> a(n), v[n + 1], ans(n, 1);
for (int i = 0; i < n; i++)
cin >> a[i], v[minp[i + 1]].pb(i);
for (int i = 1; i <= n; i++)
if (v[i].size())
{
int m = v[i].size();
for (int j = 0; j < m; j++)
if (a[v[i][j]] > m - j - 1)
{
cout << "No\n";
return;
}
ans[v[i].back()] = 5e5;
update(5e5, 1);
for (int j = m - 2; j >= 0; j--)
{
int l = 1, r = 1e6;
while (l + 1 < r)
{
int mid = (l + r) / 2;
if (query(1, mid - 1) <= a[v[i][j]])
l = mid;
else
r = mid;
}
if (query(1, l - 1) != a[v[i][j]])
{
cout << "No\n";
return;
}
update(l, query(l, l) + 1);
ans[v[i][j]] = l;
}
}
cout << "Yes\n";
for (auto &x : ans)
cout << x << " ", update(x, 0);
cout << '\n';
}
int32_t main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
T.resize(4e6);
for (int i = 1; i <= s; i++)
update(i, 0);
sieve(1e6);
int t = 1;
cin >> t;
for (int i = 1; i <= t; i++)
My_Solve(i);
return 0;
}