// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
 
template<class T>
    bool minimize(T &a, const T &b) {
        if (a > b) return a = b, true;
        return false;
    }
 
template<class T>
    bool maximize(T &a, const T &b) {
        if (a < b) return a = b, true;
        return false;
    }
 
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "icebear"
/*END OF TEMPLATE. ICEBEAR AND THE CAT WILL WIN VOI26 */
 
const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const ll INF = 1e18 + 27092008;
const int N = 2e5 + 5;
int n, p[N];
int cnt[N];
bool vis[N];
vector<int> lenCycle;
int notCycle;
vector<int> G[N];
int dist[N], dist_to_cycle[N], par[N];
 
struct DisjointSet {
    vector<int> lab;
    DisjointSet(int n = 0): lab(n + 5, -1) {}
 
    int root(int v) {
        return lab[v] < 0 ? v  : lab[v] = root(lab[v]);
    }
 
    bool unite(int u, int v) {
        u = root(u); v = root(v);
        if (u == v) return false;
        if (lab[u] > lab[v]) swap(u, v);
        lab[u] += lab[v];
        lab[v] = u;
        return true;
    }
};
 
int power(int x, int k) {
    int res = 1;
    while(k) {
        if (k & 1) res = 1LL * res * x % MOD;
        k >>= 1;
        x = 1LL * x * x % MOD;
    }
    return res;
}
 
int BFS(int sta, int dest) {
    queue<int> q;
    dist[sta] = 1;
    q.push(sta);
    int mx = 0;
    while(!q.empty()) {
        int u = q.front(); q.pop();
        maximize(mx, dist[u]);
        for(int v : G[u]) if (dist[v] == 0) {
            if (u == sta && v == dest) continue;
            dist[v] = dist[u] + 1;
            par[v] = u;
            q.push(v);
        }
    }
 
    if (sta == dest) {
        maximize(notCycle, mx);
        return 0;
    }
 
    if (par[dest] == 0) {
        dist[dest] = 2;
        par[dest] = sta;
    }
 
    int res = dist[dest];
 
    while(dest != sta) {
        dist_to_cycle[dest] = 1;
        q.push(dest);
        dest = par[dest];
    }
 
    dist_to_cycle[sta] = 1;
    q.push(sta);
 
    while(!q.empty()) {
        int u = q.front(); q.pop();
        for(int v : G[u]) if (dist_to_cycle[v] == 0) {
            dist_to_cycle[v] = dist_to_cycle[u] + 1;
            q.push(v);
        }
    }
 
    return res;
}
 
void init(void) {
    cin >> n;
    FOR(i, 1, n) cin >> p[i];
}
 
void process(void) {
    vector<int> sta, dest;
    DisjointSet dsu(n);
    FOR(i, 1, n) {
        G[i].pb(p[i]);
        G[p[i]].pb(i);
        if (dsu.unite(i, p[i]) == false) {
            sta.pb(i);
            dest.pb(p[i]);
        }
    }
 
    FOR(i, 0, (int)sta.size() - 1) lenCycle.pb(BFS(sta[i], dest[i]));
 
    int ans = 1;
    for(int x : lenCycle) {
        for(int j = 2; j * j <= x; j++) {
            int res = 0;
            while(x % j == 0) {
                res++;
                x /= j;
            }
            maximize(cnt[j], res);
        }
        if (x > 1) maximize(cnt[x], 1);
    }
 
    FOR(i, 1, 100000) ans = 1LL * ans * power(i, cnt[i]) % MOD;
    cout << max((ans + *max_element(dist_to_cycle + 1, dist_to_cycle + n + 1) - 1) % MOD, notCycle);
}
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    if (fopen(task".inp", "r")) {
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    int tc = 1;
//    cin >> tc;
    while(tc--) {
        init();
        process();
    }
    return 0;
}
 
				Ly8gfn4gaWNlYmVhciB+fgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOwp0eXBlZGVmIHBhaXI8aW50LCBpaT4gaWlpOwoKdGVtcGxhdGU8Y2xhc3MgVD4KICAgIGJvb2wgbWluaW1pemUoVCAmYSwgY29uc3QgVCAmYikgewogICAgICAgIGlmIChhID4gYikgcmV0dXJuIGEgPSBiLCB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCnRlbXBsYXRlPGNsYXNzIFQ+CiAgICBib29sIG1heGltaXplKFQgJmEsIGNvbnN0IFQgJmIpIHsKICAgICAgICBpZiAoYSA8IGIpIHJldHVybiBhID0gYiwgdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgojZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgRk9SUihpLGEsYikgZm9yKGludCBpPShhKTsgaT49KGIpOyAtLWkpCiNkZWZpbmUgUkVQKGksIG4pIGZvcihpbnQgaT0wOyBpPChuKTsgKytpKQojZGVmaW5lIFJFRChpLCBuKSBmb3IoaW50IGk9KG4pLTE7IGk+PTA7IC0taSkKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIEJJVChTLCBpKSAoKChTKSA+PiAoaSkpICYgMSkKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGFsbCh4KSB4LmJlZ2luKCksIHguZW5kKCkKI2RlZmluZSB0YXNrICJpY2ViZWFyIgovKkVORCBPRiBURU1QTEFURS4gSUNFQkVBUiBBTkQgVEhFIENBVCBXSUxMIFdJTiBWT0kyNiAqLwoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBpbmYgPSAxZTkgKyAyNzA5MjAwODsKY29uc3QgbGwgSU5GID0gMWUxOCArIDI3MDkyMDA4Owpjb25zdCBpbnQgTiA9IDJlNSArIDU7CmludCBuLCBwW05dOwppbnQgY250W05dOwpib29sIHZpc1tOXTsKdmVjdG9yPGludD4gbGVuQ3ljbGU7CmludCBub3RDeWNsZTsKdmVjdG9yPGludD4gR1tOXTsKaW50IGRpc3RbTl0sIGRpc3RfdG9fY3ljbGVbTl0sIHBhcltOXTsKCnN0cnVjdCBEaXNqb2ludFNldCB7CiAgICB2ZWN0b3I8aW50PiBsYWI7CiAgICBEaXNqb2ludFNldChpbnQgbiA9IDApOiBsYWIobiArIDUsIC0xKSB7fQoKICAgIGludCByb290KGludCB2KSB7CiAgICAgICAgcmV0dXJuIGxhYlt2XSA8IDAgPyB2ICA6IGxhYlt2XSA9IHJvb3QobGFiW3ZdKTsKICAgIH0KCiAgICBib29sIHVuaXRlKGludCB1LCBpbnQgdikgewogICAgICAgIHUgPSByb290KHUpOyB2ID0gcm9vdCh2KTsKICAgICAgICBpZiAodSA9PSB2KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGxhYlt1XSA+IGxhYlt2XSkgc3dhcCh1LCB2KTsKICAgICAgICBsYWJbdV0gKz0gbGFiW3ZdOwogICAgICAgIGxhYlt2XSA9IHU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn07CgppbnQgcG93ZXIoaW50IHgsIGludCBrKSB7CiAgICBpbnQgcmVzID0gMTsKICAgIHdoaWxlKGspIHsKICAgICAgICBpZiAoayAmIDEpIHJlcyA9IDFMTCAqIHJlcyAqIHggJSBNT0Q7CiAgICAgICAgayA+Pj0gMTsKICAgICAgICB4ID0gMUxMICogeCAqIHggJSBNT0Q7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgppbnQgQkZTKGludCBzdGEsIGludCBkZXN0KSB7CiAgICBxdWV1ZTxpbnQ+IHE7CiAgICBkaXN0W3N0YV0gPSAxOwogICAgcS5wdXNoKHN0YSk7CiAgICBpbnQgbXggPSAwOwogICAgd2hpbGUoIXEuZW1wdHkoKSkgewogICAgICAgIGludCB1ID0gcS5mcm9udCgpOyBxLnBvcCgpOwogICAgICAgIG1heGltaXplKG14LCBkaXN0W3VdKTsKICAgICAgICBmb3IoaW50IHYgOiBHW3VdKSBpZiAoZGlzdFt2XSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh1ID09IHN0YSAmJiB2ID09IGRlc3QpIGNvbnRpbnVlOwogICAgICAgICAgICBkaXN0W3ZdID0gZGlzdFt1XSArIDE7CiAgICAgICAgICAgIHBhclt2XSA9IHU7CiAgICAgICAgICAgIHEucHVzaCh2KTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHN0YSA9PSBkZXN0KSB7CiAgICAgICAgbWF4aW1pemUobm90Q3ljbGUsIG14KTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAocGFyW2Rlc3RdID09IDApIHsKICAgICAgICBkaXN0W2Rlc3RdID0gMjsKICAgICAgICBwYXJbZGVzdF0gPSBzdGE7CiAgICB9CgogICAgaW50IHJlcyA9IGRpc3RbZGVzdF07CgogICAgd2hpbGUoZGVzdCAhPSBzdGEpIHsKICAgICAgICBkaXN0X3RvX2N5Y2xlW2Rlc3RdID0gMTsKICAgICAgICBxLnB1c2goZGVzdCk7CiAgICAgICAgZGVzdCA9IHBhcltkZXN0XTsKICAgIH0KCiAgICBkaXN0X3RvX2N5Y2xlW3N0YV0gPSAxOwogICAgcS5wdXNoKHN0YSk7CgogICAgd2hpbGUoIXEuZW1wdHkoKSkgewogICAgICAgIGludCB1ID0gcS5mcm9udCgpOyBxLnBvcCgpOwogICAgICAgIGZvcihpbnQgdiA6IEdbdV0pIGlmIChkaXN0X3RvX2N5Y2xlW3ZdID09IDApIHsKICAgICAgICAgICAgZGlzdF90b19jeWNsZVt2XSA9IGRpc3RfdG9fY3ljbGVbdV0gKyAxOwogICAgICAgICAgICBxLnB1c2godik7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXM7Cn0KCnZvaWQgaW5pdCh2b2lkKSB7CiAgICBjaW4gPj4gbjsKICAgIEZPUihpLCAxLCBuKSBjaW4gPj4gcFtpXTsKfQoKdm9pZCBwcm9jZXNzKHZvaWQpIHsKICAgIHZlY3RvcjxpbnQ+IHN0YSwgZGVzdDsKICAgIERpc2pvaW50U2V0IGRzdShuKTsKICAgIEZPUihpLCAxLCBuKSB7CiAgICAgICAgR1tpXS5wYihwW2ldKTsKICAgICAgICBHW3BbaV1dLnBiKGkpOwogICAgICAgIGlmIChkc3UudW5pdGUoaSwgcFtpXSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgc3RhLnBiKGkpOwogICAgICAgICAgICBkZXN0LnBiKHBbaV0pOwogICAgICAgIH0KICAgIH0KCiAgICBGT1IoaSwgMCwgKGludClzdGEuc2l6ZSgpIC0gMSkgbGVuQ3ljbGUucGIoQkZTKHN0YVtpXSwgZGVzdFtpXSkpOwoKICAgIGludCBhbnMgPSAxOwogICAgZm9yKGludCB4IDogbGVuQ3ljbGUpIHsKICAgICAgICBmb3IoaW50IGogPSAyOyBqICogaiA8PSB4OyBqKyspIHsKICAgICAgICAgICAgaW50IHJlcyA9IDA7CiAgICAgICAgICAgIHdoaWxlKHggJSBqID09IDApIHsKICAgICAgICAgICAgICAgIHJlcysrOwogICAgICAgICAgICAgICAgeCAvPSBqOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1heGltaXplKGNudFtqXSwgcmVzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHggPiAxKSBtYXhpbWl6ZShjbnRbeF0sIDEpOwogICAgfQoKICAgIEZPUihpLCAxLCAxMDAwMDApIGFucyA9IDFMTCAqIGFucyAqIHBvd2VyKGksIGNudFtpXSkgJSBNT0Q7CiAgICBjb3V0IDw8IG1heCgoYW5zICsgKm1heF9lbGVtZW50KGRpc3RfdG9fY3ljbGUgKyAxLCBkaXN0X3RvX2N5Y2xlICsgbiArIDEpIC0gMSkgJSBNT0QsIG5vdEN5Y2xlKTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4odGFzayIuaW5wIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4odGFzayIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpbnQgdGMgPSAxOwovLyAgICBjaW4gPj4gdGM7CiAgICB3aGlsZSh0Yy0tKSB7CiAgICAgICAgaW5pdCgpOwogICAgICAgIHByb2Nlc3MoKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==