I have used the method given in the editorial. I am repeatedly getting WA. Can somebody point out the mistake?
Code:
#include
#define si(a) scanf("%d",&a)
#define M 1000000007
#define ULL unsigned long long
using namespace std;
int primes[100001];
int prm[9592];
int mul[100001];
void generate(void)
{
int i,j;
for(i=2;i<=100000;i++)primes[i]=1;
primes[0]=0;
primes[1]=0;
for(i=2;i<=100000;i++){
if(primes[i]==1){
for(j=2;i*j<=100000;j++)primes[i*j]=0;
}
}
j=0;
for(i=2;i<=100000;i++){
if(primes[i]==1){
prm[j]=i;
j++;
}
}
}
int Arr[100001],V[100001];
int pwr[9592]={0};
ULL powr(ULL a,ULL n)
{
ULL ans=a,p=0,q=0,k;
if(n==0)return 1;
if(n==1)return a;
else {
p=powr(a,n/2);
q=powr(a,n%2);
k=(((p*p)%M)*q)%M;
return k;
}
}
int main()
{
int t,x,i;
ULL len=0;
generate();
si(t);
while(t--){
int n;
si(n);
for(i=0;i<9592;i++)pwr[i]=0;
for(i=0;i<100001;i++)mul[i]=0;
V[0]=1;
for(i=1;i<=n;i++){
si(Arr[i]);
V[i]=0;
}
ULL num,ans=1;
for(i=1;i<=n;i++){
if(!V[i]){
len=1;x=Arr[i];
while(x!=i){
V[x]=1;
len++;
x=Arr[x];
}
num=len;
int cnt=0;
if(primes[num]&&(!mul[num])){
ans*=num;
mul[num]=1;
ans%=M;
}
else if(!primes[num]){
for(int j=0;prm[j]<=sqrt(num);j++){
cnt=0;
while(num%prm[j]==0){
cnt++;
num/=prm[j];
}
if(cnt&&mul[prm[j]])cnt--;
if(cnt>pwr[j])pwr[j]=cnt;
}
}
}
}
for(i=0;prm[i]<=sqrt(n);i++){
if(pwr[i]){
ans*=powr(prm[i],pwr[i]);
ans=ans%M;
}
}
printf("%llu\n",ans);
}
return 0;
}
