const int MAXN=55,Mod=1e9+7;
struct Edge{
int to,next;
}edge[MAXN<<1];
int head[MAXN],edge_cnt;
void Insert(int u,int v){
edge[++edge_cnt]=Edge{v,head[u]};
head[u]=edge_cnt;
}
int sz2[MAXN],mson[MAXN],tot_sz,root_sz;
void find_root(int u,int fa){
sz2[u]=1;mson[u]=0;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)
continue;
find_root(v,u);
sz2[u]+=sz2[v];
mson[u]=max(mson[u],sz2[v]);
}
mson[u]=max(mson[u],tot_sz-sz2[u]);
if(mson[u]<root_sz)
root_sz=mson[u];
}
int sz[MAXN],h1[MAXN],h2[MAXN];
void Hash(int u,int fa){
sz[u]=1,h1[u]=h2[u]=0;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
Hash(v,u);
sz[u]+=sz[v];
h1[u]=(h1[u]+1LL*h1[v]*sz[v])%Mod;
h2[u]=(h2[u]+1LL*h2[v]*sz[v])%Mod;
}
h1[u]=(h1[u]+sz[u])%Mod;
h2[u]=(1LL*h2[u]*sz[u]+sz[u])%Mod;
}
vector<pair<int,int> >root[MAXN];
bool cmp(int a,int b){
if(root[a].size()!=root[b].size())
return false;
if(root[a].size()==1){
if(root[a][0]==root[b][0])
return true;
}
else{
if(root[a][0]==root[b][0]&&root[a][1]==root[b][1])
return true;
if(root[a][0]==root[b][1]&&root[a][1]==root[b][0])
return true;
}
return false;
}
int main()
{
int T=read_int(),n,p;
_rep(k,1,T){
n=read_int(),edge_cnt=0;
_rep(i,1,n)head[i]=0;
_rep(i,1,n){
p=read_int();
if(p){
Insert(p,i);
Insert(i,p);
}
}
tot_sz=root_sz=n;
find_root(1,0);
_rep(i,1,n){
if(mson[i]==root_sz){
Hash(i,0);
root[k].push_back(make_pair(h1[i],h2[i]));
}
}
_rep(i,1,k){
if(cmp(i,k)){
enter(i);
break;
}
}
}
return 0;
}