#include using namespace std; int _gcd(int a, int b) { int c, vysl; if (a==b) { return a; } if (b>a){ if (b % a == 0) { return b; } else { return a*b; } } if (a>b) { if (a % b == 0) { return a; } else { return a*b; } } } int main() { int n; while(std::cin >>n) { int m[n + 1]; for (int i = 1; i <= n; ++i) { cin >> m[i]; } int swaps = 0; vector perms; bool p[n + 1]; memset(p, 0, (n + 1) * sizeof(bool)); int i = 1; for(;;) { while(i < n + 1 && p[i]) i++; if(i >= n + 1) break; /*printf("start from index %d = %d\n", i, m[i]); for(int k = 1; k < n + 1; k++) { printf(">>%d ", p[k]); }*/ /*int start = m[i]; int permSize = 1; printf("("); for(int j = m[start]; start != m[j]; j = m[j]) { p[j] = true; permSize++; printf("%d ", m[j]); } printf(")"); */ int permSize = 1; int start = m[i]; i = m[i]; p[start] = 1; //printf("( %d ", start); while(m[i] != start) { i = m[i]; p[i] = 1; permSize++; //printf("%d ", i); } //printf(")"); perms.push_back(permSize); } int maxP = 0; //printf("perms "); for(auto i: perms) { //printf("%d ", i); // maxP = _gcd(maxP, i); maxP += (i - 1); } //printf("\n"); printf("%d\n", maxP); } }