#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long countDivisor(long long n) {
  long long divisor = 0;
  for (long long i = 1; i * i <= n; i++) {
    if (i * i == n)
      divisor += 1;
    else if (n % i == 0)
      divisor += 2;
  }
  return divisor;
}
long long bigmod(long long b, long long p, long long n) {
  if (p == 0)
    return 1;
  else if (p % 2 == 0) {
    long long half1 = bigmod(b, p / 2, n);
    long long half2 = bigmod(b, p / 2, n);
    return ((half1 * half2) % n);
  } else if (p % 2 == 1) {
    long long p1 = b % n;
    long long p2 = bigmod(b, p - 1, n);
    return ((p1 * p2) % n);
  }
}
long long powr(long long n, long long m) {
  long long ans = 1;
  for (long long i = 1; i <= m; i++) ans *= n;
  return ans;
}
bool prime(long long n) {
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) return false;
  }
  return true;
}
int fx[] = {+1, -1, +0, +0};
int fy[] = {+0, +0, +1, -1};
vector<long long> edge[100000];
long long dis[100000], pt[100000];
bool vis[100000];
void dfs(long long n, const long long k) {
  long long m;
  vis[n] = true;
  for (long long i = 0; i < edge[n].size(); i++) {
    m = edge[n][i];
    if (!vis[m]) {
      vis[m] = true;
      dis[m] = dis[n] + 1;
      pt[m] = n;
      dfs(m, k);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  long long m;
  cin >> m;
  for (long long i = 1, x, y; i <= m; i++) {
    cin >> y;
    edge[i].push_back(y);
    edge[y].push_back(i);
  }
  long long k = 0;
  for (long long i = 1; i <= m; i++) {
    if (!vis[i]) {
      dfs(i, k);
      k++;
    }
  }
  cout << k;
}
