// ~~ 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==