#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <math.h>
#include <functional>
#include <numeric>
#define int long long
#define endl '\n'
#define ull unsigned long long
#define ll long long
#define pii pair<int,int>
#define cy cout<<"Yes"<<'\n'
#define cn cout<<"No"<<'\n'
#define forn(i,begin,end,add) for(ll (i)=(begin);(i)<=(end);(i)+=(add))
#define rforn(i,begin,end,sub) for(ll (i)=(end);(i)>=(begin);(i)-=(sub))
#define vv vector
#define inf32 INT32_MAX/2
#define inf64 INT64_MAX/2
#define LD long double
#define PI acos(-1)
#define debug(a,b) cout<<a<<b
#define eps 1e-12
const int N = 4e5 + 100;
ll T;
const ll mod = 1e9 + 7;
int t = 1;
int tot = 0;
int cnt;
vv<int> dfn;
vv<int> low;
vv<int> instk;
vv<int> siz;
vv<int> scc;
vv<vv<int>>e;
int root;
vv<int>cut;
void init(int n, int rt) {
cnt = 0, tot = 0;
e = vv<vv<int>>(n + 1, vv<int>());
dfn = low = vv<int>(n + 1);
instk = vv<int>(n + 1);
int root = rt;
cut = vv<int>(n + 1);
}
void tarjan(int x) {
dfn[x] = low[x] = ++tot;
instk[x] = true;
for (int y : e[x]) {
if (!dfn[y]) {
tarjan(y);
low[x] = min(low[x], low[y]);
}
else if (instk[y]) {
low[x] = min(low[x], dfn[y]);
}
}
}
void solve() {
int n; cin >> n;
init(n, 1);
vv<int>du(n + 1);
forn(i, 1, n, 1) {
int a; cin >> a;
e[a].push_back(i);
du[i]++;
}
int ans = 0;
forn(i, 1, n, 1)
if (!dfn[i] && du[i] == 0)
ans++, tarjan(i);
forn(i, 1, n, 1)
if (!dfn[i])
ans++, tarjan(i);
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
while (t--)
solve();
return 0;
}