#include <bits/stdc++.h>   using namespace std;   const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};   const long long linf = 4000000000000000000LL;   const long long inf = 998244353;   const long double pi = 3.1415926535;   long long maximum(long long x, long long y) {     if (x > y) return x;     return y;   }   long long minimum(long long x, long long y) {     if (x < y) return x;     return y;   }   void pv(vector<int> a) {     for (auto& x : a) cout << x <<    ;     cout <<   n ;   }   void pv(vector<long long> a) {     for (auto& x : a) cout << x <<    ;     cout <<   n ;   }   void pv(vector<vector<int> > a) {     for (int i = (0); i < (a.size()); ++i) {       cout << i <<   n ;       pv(a[i]);       cout <<   n ;     }   }   void pv(vector<vector<long long> > a) {     for (int i = (0); i < (a.size()); ++i) {       cout << i <<   n ;       pv(a[i]);     }     cout <<   n ;   }   void pv(vector<string> a) {     for (auto& x : a) cout << x <<   n ;     cout <<   n ;   }   int modInverse(int a, int m) {     int m0 = m;     int y = 0, x = 1;     if (m == 1) return 0;     while (a > 1) {       int q = a / m;       int t = m;       m = a % m, a = t;       t = y;       y = x - q * y;       x = t;     }     if (x < 0) x += m0;     return x;   }   long long power(long long x, long long y) {     long long k = 1 << 30;     long long z = 1;     while (k != 0) {       z *= z;       z %= inf;       if (y >= k) {         z *= x;         z %= inf;         y -= k;       }       k >>= 1;     }     return z;   }   long double area(pair<int, int> x, pair<int, int> y, pair<int, int> z) {     return ((long long)x.second * y.first + (long long)y.second * z.first +             (long long)z.second * x.first - (long long)x.first * y.second -             (long long)y.first * z.second - (long long)z.first * x.second) /            2.0;   }   bool clockwise(pair<int, int> x, pair<int, int> y, pair<int, int> z) {     return area(x, y, z) > 0;   }   struct point {     long double x, y;   };   long double area(point x, point y, point z) {     return (x.y * y.x + y.y * z.x + z.y * x.x - x.x * y.y - y.x * z.y -             z.x * x.y) /            2.0;   }   bool clockwise(point x, point y, point z) { return area(x, y, z) > 0; }   int gcd(int a, int b) {     if (a > b) swap(a, b);     if (a == 0) return b;     return gcd(a, b % a);   }   int popcount(int a) {     int count = 0;     while (a != 0) {       count += (a % 2);       a >>= 1;     }     return count;   }   long long choose(long long n, long long r) {     long long p = 1, k = 1;     if (n - r < r) r = n - r;     if (r != 0) {       while (r) {         p *= n;         k *= r;         long long m = gcd(p, k);         p /= m;         k /= m;         n--;         r--;       }     } else       p = 1;     return p;   }   vector<long long> prefix_hash(string& a, vector<long long>& powers) {     int n = int(a.size());     vector<long long> prefix(n + 1);     for (int i = (0); i < (n); ++i)       prefix[i + 1] = (prefix[i] + powers[i] * (a[i] -  a  + 1)) % inf;     return prefix;   }   void setIO(string second) {     ios_base::sync_with_stdio(0);     cin.tie(0);   }   int n;   vector<vector<int> > adj;   vector<int> v;   void dfs(int i, int p) {     v[i] = 1;     for (auto& x : adj[i]) {       if (x != p) dfs(x, i);     }   }   int main() {     setIO( test3 );     cin >> n;     adj.resize(n);     for (int i = (0); i < (n); ++i) {       int a;       cin >> a;       adj[--a].push_back(i);       adj[i].push_back(a);     }     int ans = 0;     v.resize(n);     for (int i = (0); i < (n); ++i) {       if (!v[i]) {         ans++;         dfs(i, -1);       }     }     cout << ans <<   n ;   }