SGARDEN WA

I Tried alot but couldn’t find in the bug in the code .Keeps giving WA,can anyone suggest some modifications in code or Test Cases that it fails .Thanks in Advance… :slight_smile:

#include<bits/stdc++.h>
#define MOD 1000000007
#define gc getchar_unlocked
#define pc putchar_unlocked
#define FOR(i, j, k, in) for (int i=j ; i<=k ; i+=in)
#define RFOR(i, j, k, in) for (int i=j ; i>=k ; i-=in)
using namespace std;
// FAST I/O Generic function
template< class T > T _abs(T n) { return (n < 0 ? -n : n); }
template< class T > T _max(T a, T b) { return (!(a < b) ? a : b); }
template< class T > T _min(T a, T b) { return (a < b? a : b); }
template< class T > T sq(T x) { return x * x; }
template< class T > bool inside(T a, T b, T c) { return a<=b && b<=c; }
template <class T>
inline T read()
{
T n=0;
bool sign=0;
char p=gc();
if(p=='-')
sign=1;
while((p<'0'||p>'9')&&p!=EOF&&p!='-')
p=gc();
if(p=='-')
sign=1,p=gc();
while(p>='0'&&p<='9') {
n = (n<< 3) + (n<< 1) + (p - '0');
p=gc();
}
if(sign)
return -n;
return n;
}
inline void readStr(char *str)
{
register char c=0;
register int i = 0;
while (c < 33)
c = gc();
while (c > 65)
{
str[i] = c;
c = gc();
i = i + 1;
}

str[i] = '\0';
}
//Generic fast output function
template <class T> inline void write(T x)
{
int i = 20;
char buf[21];
buf[20] = '\n';

do
{
buf[--i] = x % 10 + '0';
x/= 10;
}while(x);
do
{
pc(buf[i]);
} while (buf[i++] != '\n');
}
typedef unsigned long long int ulld;
vector<int>isprime(100001,0);
vector<ulld> prime;
void inline sieve()
{
    FOR(i,2,100000,1)
        {
            if(isprime[i]==0)
                {
                    prime.push_back(i);
                    FOR(k,i,100001,i)
                        isprime[k]=1;
                }

        }
}

ulld mod_pow(ulld base , ulld exponent,ulld modulus)
{
ulld result=1;
while(exponent>0)
{
if(exponent&1)
{
result=(resultbase)%modulus;
}
exponent=exponent>>1;
base=(base
base)%modulus;
}
return result;
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);

#endif
sieve();
int x,t=read<int>();
FOR(i,0,t-1,1)
{
    int n=read<int>();
    int A[n+1];
    A[0]=1;///dummy
    int visited[n+1];
    vector<int>cycle(n+1,0);
    FOR(j,1,n,1)
        {
            A[j]=read<int>();
            visited[j]=0;
        }
    int c=1;
    FOR(j,1,n,1)
        {
            int x=j;
            if(visited[x]==0)
                {
                    c=0;
                    while(visited[x]==0)
                        {
                            visited[x]=1;
                            ++c;
                            x=A[x];
                        }
                }
            cycle[c]=1;
        }
    vector<ulld>power(100001,0);
    FOR(j,0,cycle.size()-1,1)
    {

        if(cycle[j])
            {   int k=0,n=j;
                int limit=ceil(sqrt(j));
                while(prime[k]<=limit)
                {
                    int count=0;
                    while(n%prime[k]==0)
                    {
                        ++count;
                        n/=prime[k];
                    }
                    power[prime[k]]=(power[prime[k]]>count)?(power[prime[k]]):count;
                    ++k;
                }
                if(n==j)
                power[j]=1;

            }

    }
    ulld ans=1,temp;
    FOR(j,0,prime.size()-1,1)
    {
        if(power[prime[j]])
        {
            temp=mod_pow(prime[j],power[prime[j]],MOD);
            ans=(ans*temp)%MOD;
        }

    }
 write<ulld>(ans);
}
return 0;
}