#include #include #define NO {puts("NO");continue;} #define YES {puts("YES");continue;} #define N 100005 using namespace std;const int INF=1e9; struct arr{int go,next,s,w;}a[N]; int S,T,n,i,ans,cnt,U,j,x,m,one,Test; int End[N],F[N],f[N],flag[N],pre[N],q[N],d[N],edge[N]; inline void add(int u,int v,int s,int w){ a[++cnt]=(arr){v,End[u],s,w};End[u]=cnt; a[++cnt]=(arr){u,End[v],0,-w};End[v]=cnt; } int SPFA(){ for (int i=1;i<=T;i++) pre[i]=flag[i]=0,f[i]=INF; flag[S]=1;f[S]=0;int h=0,t=1;q[1]=S; while (h=f[x=a[i].go]) continue; f[x]=f[k]+a[i].w;pre[x]=i; if (!flag[x]) q[++t]=x,flag[x]=1; }flag[k]=0; }return f[T]!=INF; } int check(){ int num=0,n1=0,n2=0; for (int i=1;i<=m;i++) if ((d[i]&1)&&a[edge[i]].s>0) return 0; for (int i=1;i<=m;i++) if (d[i]&1^1){ if (a[edge[i]].s==1) { if (F[d[i]+1]) return 0;n1++; }else if (a[edge[i]].s==2){ if (F[d[i]+1]) return 0;n2++; } }if (n1&1) return 0; if (n1+n2==0) { if (one==0) return 1; if (one<=2) return 0; return 1; }if (n1==0) return n2==1?one>=2:one>=n2; return one>=n1/2+n2; } int cheat(){ cnt=1;for (int i=1;i<=T;i++) End[i]=0; for (int i=1;i<=n;i++) if (d[i]&1){ add(S,i,2,0); for (int j=1;j<=n;j++) if (d[j]&1^1) if (!F[d[i]+d[j]]) add(i,j,1,0); }else add(i,T,2,0); int ans=0; while (SPFA()){ ans++; for (int i=pre[T];i;i=pre[a[i^1].go]) a[i].s--,a[i^1].s++; }return ans>=n; } int main(){ for (U=400,i=2;i<=U;i++) for (j=i+i;j<=U;j+=i) F[j]=1; scanf("%d",&Test); while (Test--){ scanf("%d",&n);S=n+1;T=n+2;m=0;one=0; for (cnt=1,i=1;i<=T;i++) End[i]=0; for (i=1;i<=n;i++){ scanf("%d",&x); if (x>1) d[++m]=x;else one++; }for (i=m+1;i<=n;i++) d[i]=1; for (i=1;i<=m;i++) if (d[i]&1){ add(S,i,2,0);edge[i]=cnt-1; for (j=1;j<=n;j++) if (d[j]&1^1) if (!F[d[i]+d[j]]) add(i,j,1,0); }else add(i,T,2,F[d[i]+1]?0:1e4),edge[i]=cnt-1; while (SPFA()) for (i=pre[T];i;i=pre[a[i^1].go]) a[i].s--,a[i^1].s++; if (check()) YES else if (cheat()) YES else NO } }