//Codechef July challenge
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<queue>
#define MOD 1000000007
#define MAX 1000000
using namespace std;
vector<int>graph[100000+7];
vector<int>mark(100000+7);
int n;
vector<bool>isprime(MAX+5,false);
vector<int>prime;
void sieve()
{
isprime[0]=isprime[1]=true;
for(int i=2;i<=sqrt(MAX);i++)
{
if(isprime[i]==false)
{
for(int j=2;i*j<=MAX;j++)
isprime[i*j]=true;
}
}
for(int i=2;i<=MAX;i++)
if(isprime[i]==false)
prime.push_back(i);
}
void input()
{
int num;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
graph[i].push_back(num);
graph[num].push_back(i);
mark[i]=0;
}
}
int bfs(int s)
{
queue<int>q;
q.push(s);
int count=1;
mark[s]=1;
while(!q.empty())
{
int nw=q.front();
q.pop();
for(int i=0;i<graph[nw].size();i++)
{
if(mark[graph[nw][i]]==0)
{
mark[graph[nw][i]]=1;
q.push(graph[nw][i]);
count++;
}
}
}
return count;
}
int main()
{
sieve();
int t;
scanf("%d",&t);
while(t--)
{
vector<int>keep;
input();
for(int i=1;i<=n;i++)
{
if(mark[i]==0)
{
keep.push_back(bfs(i));
}
}
sort(keep.begin(),keep.end());
vector<int>L(1000000+9);
int max_p=0;
for(int i=0;i<keep.size();i++)
{
int j=0;
int count=0;
while(keep[i]!=0 && j<prime.size())
{
if(keep[i]%prime[j]!=0)
{
L[prime[j]] =max(L[prime[j]] ,count);
count=0;
j++;
}
else
{
keep[i]/=prime[j];
max_p=max(max_p,prime[j]);
count++;
}
}
}
long long ans=1;
for(int i=0;i<prime.size();i++)
{
for(int j=1;j<=L[prime[i]];j++)
{
ans*=prime[i];
if(ans>MOD)
ans%=MOD;
}
}
printf("%lld\n",ans);
}
return 0;
}
Ly9Db2RlY2hlZiBKdWx5IGNoYWxsZW5nZQoKI2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPHF1ZXVlPgojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYIDEwMDAwMDAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxpbnQ+Z3JhcGhbMTAwMDAwKzddOwp2ZWN0b3I8aW50Pm1hcmsoMTAwMDAwKzcpOwppbnQgbjsKCgp2ZWN0b3I8Ym9vbD5pc3ByaW1lKE1BWCs1LGZhbHNlKTsKCnZlY3RvcjxpbnQ+cHJpbWU7Cgp2b2lkIHNpZXZlKCkKewogICAgaXNwcmltZVswXT1pc3ByaW1lWzFdPXRydWU7CiAgICBmb3IoaW50IGk9MjtpPD1zcXJ0KE1BWCk7aSsrKQogICAgewogICAgICAgIGlmKGlzcHJpbWVbaV09PWZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yKGludCBqPTI7aSpqPD1NQVg7aisrKQogICAgICAgICAgICAgICAgaXNwcmltZVtpKmpdPXRydWU7CiAgICAgICAgfQogICAgfQogICAgZm9yKGludCBpPTI7aTw9TUFYO2krKykKICAgICAgICBpZihpc3ByaW1lW2ldPT1mYWxzZSkKICAgICAgICAgICAgcHJpbWUucHVzaF9iYWNrKGkpOwp9Cgp2b2lkIGlucHV0KCkKewogICAgaW50IG51bTsKICAgIHNjYW5mKCIlZCIsJm4pOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspCiAgICB7CiAgICAgICAgc2NhbmYoIiVkIiwmbnVtKTsKICAgICAgICBncmFwaFtpXS5wdXNoX2JhY2sobnVtKTsKICAgICAgICBncmFwaFtudW1dLnB1c2hfYmFjayhpKTsKICAgICAgICBtYXJrW2ldPTA7CiAgICB9Cn0KCmludCBiZnMoaW50IHMpCnsKICAgIHF1ZXVlPGludD5xOwogICAgcS5wdXNoKHMpOwogICAgaW50IGNvdW50PTE7CiAgICBtYXJrW3NdPTE7CiAgICB3aGlsZSghcS5lbXB0eSgpKQogICAgewogICAgICAgIGludCBudz1xLmZyb250KCk7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICBmb3IoaW50IGk9MDtpPGdyYXBoW253XS5zaXplKCk7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYobWFya1tncmFwaFtud11baV1dPT0wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtYXJrW2dyYXBoW253XVtpXV09MTsKICAgICAgICAgICAgICAgIHEucHVzaChncmFwaFtud11baV0pOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKaW50IG1haW4oKQp7CiAgICBzaWV2ZSgpOwogICAgaW50IHQ7CiAgICBzY2FuZigiJWQiLCZ0KTsKICAgIHdoaWxlKHQtLSkKICAgIHsKICAgICAgICB2ZWN0b3I8aW50PmtlZXA7CiAgICAgICAgaW5wdXQoKTsKICAgICAgICBmb3IoaW50IGk9MTtpPD1uO2krKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKG1hcmtbaV09PTApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtlZXAucHVzaF9iYWNrKGJmcyhpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IAogICAgICAgIHNvcnQoa2VlcC5iZWdpbigpLGtlZXAuZW5kKCkpOwogICAgICAgIHZlY3RvcjxpbnQ+TCgxMDAwMDAwKzkpOwogICAgICAgIGludCBtYXhfcD0wOwogICAgICAgIGZvcihpbnQgaT0wO2k8a2VlcC5zaXplKCk7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGo9MDsKICAgICAgICAgICAgaW50IGNvdW50PTA7CiAgICAgICAgICAgIHdoaWxlKGtlZXBbaV0hPTAgJiYgajxwcmltZS5zaXplKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKGtlZXBbaV0lcHJpbWVbal0hPTApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTFtwcmltZVtqXV0gPW1heChMW3ByaW1lW2pdXSAsY291bnQpOwogICAgICAgICAgICAgICAgICAgIGNvdW50PTA7CiAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGtlZXBbaV0vPXByaW1lW2pdOwogICAgICAgICAgICAgICAgICAgIG1heF9wPW1heChtYXhfcCxwcmltZVtqXSk7CiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsb25nIGxvbmcgYW5zPTE7CiAgICAgICAgZm9yKGludCBpPTA7aTxwcmltZS5zaXplKCk7aSsrKQogICAgICAgIHsgCiAgICAgICAgICAgIGZvcihpbnQgaj0xO2o8PUxbcHJpbWVbaV1dO2orKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFucyo9cHJpbWVbaV07CiAgICAgICAgICAgICAgICAgICAgaWYoYW5zPk1PRCkKICAgICAgICAgICAgICAgICAgICAgICAgYW5zJT1NT0Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIlbGxkXG4iLGFucyk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=