#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define NMOD 1000000007
using namespace std;
vector<int> vj(100001);
vector<bool> vi(100001,false);
long gcd(long u,long v)
{
if (u == v)
return u;
if (u == 0)
return v;
if (v == 0)
return u;
if (~u & 1)
{
if (v & 1)
return gcd(u >> 1, v);
else
return gcd(u >> 1, v >> 1) << 1;
}
if (~v & 1)
return gcd(u, v >> 1);
if (u > v)
return gcd((u - v) >> 1, v);
return gcd((v - u) >> 1, u);
}
// long lcm(long a,long b)
// {
// long g=gcd(a,b);
// a=(a*b);
// a=a/g;
// return a;
// }
// long dp(int a,int b,long int c)
// {
// vi[a]=true;
// if(a==b)
// return c;
// else
// return dp(vj[a]-1,b,c+1);
// }
main()
{
int ti,t,n,i;
scanf("%d",&t);
for(ti=0;ti<t;ti++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&vj[i]);
bool depth[200002]={false};
long long pro1[100001];
long gd[100001];
long long c=0,a,j=1;
for(i=0;i<n;i++)
{
if(vi[i]==false)
{
vi[i]=true;
a=vj[i]-1;
j=1;
while(true)
{
vi[a]=true;
if(a==i)
{
if(depth[j]==false)
pro1[c++]=j;
depth[j]=true;
break;
}
else
{
a=vj[a]-1;
j++;
}
}
}
}
// pro1[c++]=dp(vj[i]-1,i,1);
for(i=0;i<c;i++)
printf("\n\t\t%d",pro1[i]);
gd[0]=pro1[0];
if(c>=2)
{
for(i=1;i<c;i++)
gd[i]=gcd(pro1[i],gd[i-1]);
for(i=1;i<c;i++)
pro1[i]=((pro1[i]%NMOD)*(pro1[i-1]%NMOD))%NMOD;
}
for(i=1;i<c;i++)
pro1[c-1]=(pro1[c-1]/gd[c-1]);
printf("%lld %ld\n",pro1[c-1],gd[c-1]);
for(i=0;i<n+1;i++)
vi[i]=false;
}
}
ICAgICNpbmNsdWRlPGlvc3RyZWFtPgogICAgI2luY2x1ZGU8Y3N0ZGlvPgogICAgI2luY2x1ZGU8dmVjdG9yPgogICAgI2luY2x1ZGU8YWxnb3JpdGhtPgogICAgI2RlZmluZSBOTU9EIDEwMDAwMDAwMDcKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICB2ZWN0b3I8aW50PiB2aigxMDAwMDEpOwogICAgdmVjdG9yPGJvb2w+IHZpKDEwMDAwMSxmYWxzZSk7CiAgICBsb25nICBnY2QobG9uZyB1LGxvbmcgdikKICAgIHsKICAgIGlmICh1ID09IHYpCiAgICByZXR1cm4gdTsKICAgIGlmICh1ID09IDApCiAgICByZXR1cm4gdjsKICAgIGlmICh2ID09IDApCiAgICByZXR1cm4gdTsKICAgIGlmICh+dSAmIDEpCiAgICB7CiAgICBpZiAodiAmIDEpCiAgICByZXR1cm4gZ2NkKHUgPj4gMSwgdik7CiAgICBlbHNlCiAgICByZXR1cm4gZ2NkKHUgPj4gMSwgdiA+PiAxKSA8PCAxOwogICAgfQogICAgaWYgKH52ICYgMSkKICAgIHJldHVybiBnY2QodSwgdiA+PiAxKTsKICAgIGlmICh1ID4gdikKICAgIHJldHVybiBnY2QoKHUgLSB2KSA+PiAxLCB2KTsKICAgIHJldHVybiBnY2QoKHYgLSB1KSA+PiAxLCB1KTsKICAgIH0KLy8gICAgbG9uZyBsY20obG9uZyBhLGxvbmcgYikKLy8gICAgewovLyAgICAgIGxvbmcgZz1nY2QoYSxiKTsKLy8gICAgYT0oYSpiKTsKLy8gICAgYT1hL2c7Ci8vICAgIHJldHVybiBhOwovLyAgICB9Ci8vICAgIGxvbmcgIGRwKGludCBhLGludCBiLGxvbmcgaW50IGMpCi8vICAgIHsKLy8gICAgdmlbYV09dHJ1ZTsKLy8gICAgaWYoYT09YikKLy8gICAgcmV0dXJuIGM7Ci8vICAgIGVsc2UKLy8gICAgcmV0dXJuIGRwKHZqW2FdLTEsYixjKzEpOwovLyAgICB9CiAgICBtYWluKCkKICAgIHsJCiAgICBpbnQgdGksdCxuLGk7CiAgICBzY2FuZigiJWQiLCZ0KTsKICAgIGZvcih0aT0wO3RpPHQ7dGkrKykKICAgIHsKICAgIHNjYW5mKCIlZCIsJm4pOwogICAgZm9yKGk9MDtpPG47aSsrKQogICAgc2NhbmYoIiVkIiwmdmpbaV0pOwogICAgYm9vbCBkZXB0aFsyMDAwMDJdPXtmYWxzZX07CiAgICBsb25nIGxvbmcgcHJvMVsxMDAwMDFdOwoJbG9uZyBnZFsxMDAwMDFdOwogICAgbG9uZyBsb25nIGM9MCxhLGo9MTsKICAgIGZvcihpPTA7aTxuO2krKykKICAgIHsKICAgIGlmKHZpW2ldPT1mYWxzZSkKICAgIHsKICAgIAl2aVtpXT10cnVlOwogICAgCWE9dmpbaV0tMTsKICAgIAlqPTE7CiAgICAJd2hpbGUodHJ1ZSkKICAgIAl7CiAgICAJCXZpW2FdPXRydWU7CiAgICAJCWlmKGE9PWkpCiAgICAJCXsKICAgIAkgICAgICAgIGlmKGRlcHRoW2pdPT1mYWxzZSkKICAgIAkJCXBybzFbYysrXT1qOwogICAgCQkJZGVwdGhbal09dHJ1ZTsKICAgIAkJCWJyZWFrOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYT12althXS0xOwoJCQkJaisrOwoJCQl9CiAgICAJfQogICAgfQoJfQogICAvLyBwcm8xW2MrK109ZHAodmpbaV0tMSxpLDEpOwogICAKICAgZm9yKGk9MDtpPGM7aSsrKQogICAgIHByaW50ZigiXG5cdFx0JWQiLHBybzFbaV0pOwogICBnZFswXT1wcm8xWzBdOwogICAgaWYoYz49MikKICAgIHsKICAgIGZvcihpPTE7aTxjO2krKykKICAgIGdkW2ldPWdjZChwcm8xW2ldLGdkW2ktMV0pOwkKICAgIGZvcihpPTE7aTxjO2krKykKICAgIHBybzFbaV09KChwcm8xW2ldJU5NT0QpKihwcm8xW2ktMV0lTk1PRCkpJU5NT0Q7Cgl9Cglmb3IoaT0xO2k8YztpKyspCiAgICBwcm8xW2MtMV09KHBybzFbYy0xXS9nZFtjLTFdKTsKICAgIHByaW50ZigiJWxsZCAlbGRcbiIscHJvMVtjLTFdLGdkW2MtMV0pOwogICAgZm9yKGk9MDtpPG4rMTtpKyspCiAgICB2aVtpXT1mYWxzZTsKICAgIH0KICAgIH0KICAgIAo=