#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 1E5 + 10;

struct Edge{
	int v;
	Edge *next;
}e[MAXN << 1];

Edge *edgeCnt, *E[MAXN];

inline void addEdge(int u, int v){
	edgeCnt->v = v;
	edgeCnt->next = E[u];
	E[u] = edgeCnt++;
}

int n;
bool vis[MAXN], oncir[MAXN];

int cirflag;
int len, cir[MAXN];
int cnt[MAXN];

bool DFS(int u, int pre){
	vis[u] = true;
	for (Edge *p = E[u]; p; p = p->next)
		if (p->v != pre){
			if (vis[p->v]){
				cirflag = true;
				cir[0] = p->v;
				cir[1] = u;
				len = 2;
				return 1;
			}
			if (DFS(p->v, u)){
				if (u == cir[0])
					cirflag = false;
				if (cirflag)
					cir[len++] = u;
				return 1;
			}
		}
	return 0;
}

void count(int u, int pre){
	cnt[u] = 1;
	for (Edge *p = E[u]; p; p = p->next)
		if (!oncir[p->v] && p->v != pre){
			count(p->v, u);
			cnt[u] += cnt[p->v];
		}
}

int ct[MAXN];

bool solve(int size){
	int res = 0;
	for (int s = 0, i = 0; i < len; ++i)
		res = max(res, ++ct[(s += cnt[cir[i]]) % size]);
	for (int s = 0, i = 0; i < len; ++i)
		--ct[(s += cnt[cir[i]]) % size];

	for (int i = 1; i <= n; ++i)
		res += !oncir[i] && cnt[i] % size == 0;
	return res == n / size;
}

int main(){
	while (scanf("%d", &n) != EOF){
		edgeCnt = e;
		for (int i = 1; i <= n; ++i){
			E[i] = NULL;
			oncir[i] = vis[i] = false;
		}
		for (int v, u = 1; u <= n; ++u){
			scanf("%d", &v);
			addEdge(u, v);
			addEdge(v, u);
		}
		DFS(1, 0);
		for (int i = 0; i < len; ++i)
			oncir[cir[i]] = true;
		for (int i = 0; i < len; ++i)
			count(cir[i], 0);

		int size = 2, ans = 2;
		for (; size * size < n; ++size)
			if (n % size == 0)
				ans += solve(size) + solve(n / size);
		if (size * size == n)
			ans += solve(size);
		printf("%d\n", ans);
	}
	return 0;
}

