#include<bits/stdc++.h>
#ifdef Sabbir
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wsign-compare"
#endif
using namespace std;
#ifdef Sabbir
#include <E:\CodeBox\TempBox\Debug\debug.h>
#else
#define dbg(x...)
#endif
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<int, null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>
#define ll long long
#define all(x) (x).begin(), (x).end()
#define in(v) for(auto &b:v)cin>>b;
#define pb push_back
#define inf (long long)1e8+7
vector<int> primes;
const ll mx = 1e6+1;
vector<bool> isprime(mx,true);
void sieve(){
isprime[1] = false;
for(ll i = 2 ;i*i<=mx ;i++){
if(isprime[i]){
//primes.pb(i);
for(ll j = i*i ;j<=mx;j+=i){
isprime[j] = false;
}
}
}
for(int i = 2 ;i<=mx ;i++){
if(isprime[i])
primes.pb(i);
}
}
void pagol(){
int n;
cin>>n;
vector<int> v(n);
in(v);
vector<int> g[(int)primes.size()+5];
g[1].pb(1);
int mot=0;
for(int i = 2 ;i<=n;i++){
for(auto a:primes){
if(i%a==0){
g[a].pb(i);
mot=max(mot,a);
break;
}
}
}
vector<int> ans(n+1);
for(auto a:primes){
if(a>mot)break;
if(g[a].size()==0)continue;
reverse(all(g[a]));
ordered_set os;
for(auto b:g[a]){
int vot=v[b-1];
if(vot>os.size()){
cout<<"NO"<<endl;
return;
}
if(vot==os.size()){
if(os.size()>0)os.insert((*os.begin())-1);
else os.insert(-1e7);
// dbg(b-1,vot);
ans[b]=-(*os.begin());
}else{
ans[b]=-(*os.find_by_order(vot));
}
}
}
cout<<"YES"<<endl;
ans[1]=1;
for(int i = 1 ;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
int32_t main() {
ios::sync_with_stdio(0);cin.tie(0);
sieve();
int t = 1;
cin>>t;
while (t--) {
pagol();
}
return 0;
}
//যদ্দপী, আমি তাহাতেই মুগ্ধ হইয়া গিয়াছি