intread(){ intx(0), c(getchar()); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = x * 10 + (c - '0'), c = getchar(); return x; } voidwrite(int x){ staticchar buf[14]; if (!x) { putchar('0'); return; } intd(0); while (x) buf[d++] = x % 10 + '0', x /= 10; while (d) putchar(buf[--d]); }
constint MXN = 500005; constint DVS = 998244353; int T, N, prm[MXN], ans, cnt[MXN], coe[MXN]; bool vis[MXN];
intmain(){ T = read(); while (T--) { N = read(); for (inti(0); i != N; ++i) prm[i] = read() - 1; for (inti(0); i <= N; ++i) vis[i] = 0, cnt[i] = 0, coe[i] = 0; for (inti(0); i != N; ++i) { if (!vis[i]) { intj(i), len(0); while (!vis[j]) { vis[j] = true; ++len; j = prm[j]; } ++cnt[len]; } } for (inti(1); i <= N; ++i) if (cnt[i]) for (intj(i + i); j <= N; j += i) coe[j] += i * cnt[i]; ans = 1; for (inti(3); i <= N; ++i) { if (!cnt[i]) continue; intbas((coe[i] + cnt[i] * 1LL * i) % DVS); ans = ans * 1LL * coe[i] % DVS; for (intj(0); j != cnt[i] - 1; ++j) ans = ans * 1LL * bas % DVS; } intc1(cnt[1]), c2(cnt[2]); intn(c1 + c2 * 2); if (!c1 && !c2) { ans = 0; } elseif (!c1) { for (inti(0); i != c2 - 1; ++i) ans = ans * 1LL * n % DVS; } elseif (!c2) { if (c1 > 1) for (inti(0); i != n - 2; ++i) ans = ans * 1LL * n % DVS; } else { for (inti(0); i != c1 - 1; ++i) ans = ans * 1LL * c1 % DVS; for (inti(0); i != c2 - 1; ++i) ans = ans * 1LL * n % DVS; } write(ans), putchar('\n'); } return0; }