#include using namespace std; const int MOD = 1000000007; const int MAXN = 100005; long long fact[MAXN]; long long pow_mod(long long a, long long b) { long long res = 1; while (b > 0) { if (b % 2 == 1) { res = res * a % MOD; } a = a * a % MOD; b /= 2; } return res; } void precompute() { fact[0] = 1; for (int i = 1; i < MAXN; i++) { fact[i] = fact[i-1] * i % MOD; } } int main() { precompute(); int N; cin >> N; vector P(N+1); for (int i = 1; i <= N; i++) { cin >> P[i]; } vector visited(N+1, false); vector c(N+1, 0); for (int i = 1; i <= N; i++) { if (!visited[i]) { int len = 0; int cur = i; while (!visited[cur]) { visited[cur] = true; cur = P[cur]; len++; } c[len]++; } } bool S = true; for (int k = 1; k <= N; k++) { if (c[k] == 0) continue; if (k % 2 == 0) { S = false; } if (c[k] >= 2) { S = false; } } long long C = 1; for (int k = 1; k <= N; k++) { if (c[k] == 0) continue; long long pow_k = pow_mod(k, c[k]); C = C * pow_k % MOD; C = C * fact[c[k]] % MOD; } long long inv_C = pow_mod(C, MOD-2); long long total_Q = fact[N] * inv_C % MOD; long long ans; if (S && N >= 2) { long long inv2 = pow_mod(2, MOD-2); ans = total_Q * inv2 % MOD; } else { ans = total_Q % MOD; } cout << ans << endl; return 0; }