#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // C++ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include #define _GLIBCXX_DEBUG #define rep(i, n) for(int i=0;i<(int)(n);i++) #define pb push_back #define pob pop_back #define eb emplace_back #define nall(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define yesno(a) cout<<(a?"YES\n":"NO\n") #define accu accumulate #define bs binary_search #define lb lower_bound #define ub upper_bound #define yes cout<<"YES\n" #define no cout<<"NO\n" using namespace std; using ll = long long; using ull = unsigned long long; using pii = pair; using pll = pair; template using pq = priority_queue; template using pqg = priority_queue, greater>; template using vec = vector; template using vv = vector>; template using vvv = vector>; const ll MOD = 998244353ll; // const ll MOD = 1000000007ll; struct dsu{ vector par; vector sz; dsu(int n){ par.resize(n); sz.assign(n, 1); for (int i = 0; i < n; i++) par[i] = i; } int root(int x){ if (par[x] == x) return x; return par[x] = root(par[x]); } void merge(int x, int y){ x = root(x); y = root(y); if (x == y) return; if (sz[x] < sz[y]) swap(x, y); par[y] = x; sz[x] += sz[y]; return; } bool same(int x, int y){ return root(x) == root(y); } int size(int x){ return sz[root(x)]; } }; void solve(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(20); int t = 1; // cin >> t; while (t--) solve(); return 0; } void solve(){ int N; cin >> N; vec A(N); dsu uf(N); rep(i, N){ int x; cin >> x, x--; uf.merge(i, x); } map R; rep(i, N) R[uf.root(i)]++; int ans = 0; for (auto [k, v] : R) ans += v-1; cout << ans << endl; }