import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class O1742 {
public static void main(String[] args) throws IOException {
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(r.readLine());
int[] funcGraph = new int[n];
int[] degree = new int[n];
for (int i = 0; i < n; i++) {
funcGraph[i] = Integer.parseInt(r.readLine()) - 1;
degree[funcGraph[i]]++;
}
int loopedVertices = 0;
int loopCount = 0;
int closedLoopCount = 0;
int starterVerticles = 0;
int[] visited = new int[n];
for (int i = 0; i < n; i++) {
if(degree[i] == 0) starterVerticles++;
if(visited[i] != 0) continue;
int j = 1;
int cur = i;
List<Integer> path = new ArrayList<>();
while(visited[cur] == 0) {
visited[cur] = j++;
path.add(cur);
cur = funcGraph[cur];
}
int size = j - visited[cur];
List<Integer> loop = path.subList(visited[cur] - 1, path.size());
boolean isClosed = true;
for(int id : loop) {
if(degree[id] > 1) {
isClosed = false;
break;
}
}
loopedVertices += size;
loopCount++;
if(isClosed) {
closedLoopCount++;
}
}
System.out.print(starterVerticles + closedLoopCount);
System.out.print(" ");
System.out.println(n - loopedVertices + loopCount);
}
}
Comments