//find->fa[i]=i
//因为有环 所以 双向边标记之访问一次
//fa[find()]=find() 没关系 但siz+=.....有问题
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=2e5+10;
int n,a[maxn],fa[maxn],du[maxn],cnt;
set<int> st;
map<pair<int,int>,int> mp;
int find(int x){
return x==fa[x]? x:fa[x]=find(fa[x]);
}
int main()
{
ios::sync_with_stdio(false);
int T;cin>>T;
while(T--)
{
st.clear();mp.clear();cnt=0;
memset(fa,0,sizeof(fa));memset(du,0,sizeof(du));
cin>>n; for(int i=1;i<=n;i++) cin>>a[i],fa[i]=i;//find->fa[i]=i
for(int i=1;i<=n;i++){
if(mp[{i,a[i]}]) continue; mp[{i,a[i]}]=mp[{a[i],i}]=1; ++du[i],++du[a[i]];
int u=find(i),v=find(a[i]);
if(u==v) continue; fa[u]=v;
}
for(int i=1;i<=n;i++){
if(du[i]==1) cnt++;
st.insert(find(i));
}
cout<<min(st.size(),st.size()-cnt/2+1)<<" "<<st.size()<<'\n';
}
return 0;
}