func_code_string: #include <bits/stdc++.h>   using namespace std;   const int NMAX = 1000001;   bool vis[NMAX];   int p[NMAX];   int go(int u) {     vis[u] = true;     if (vis[p[u]]) return 1;     return 1 + go(p[u]);   }   int sizes[NMAX];   int cap[NMAX];   bitset<NMAX> knp;   int main() {     vector<int> v;     int n, k;     scanf( %d%d , &n, &k);     for (int i = 1; i <= n; i++) scanf( %d , p + i);     for (int i = 1; i <= n; i++)       if (!vis[i]) v.push_back(go(i));     int one = 0, two = 0;     for (int c : v) {       if (c % 2 == 0) {         two += c / 2;       } else {         one++;         two += c / 2;       }     }     int s = 0;     if (one + two <= k)       s = n;     else {       if (k <= two)         s = 2 * k;       else         s = 2 * two + (k - two);     }     for (int c : v) sizes[c]++;     const int T = 100;     knp[0] = true;     for (int i = 1; i <= T; i++)       if (sizes[i]) {         memset(cap, -1, sizeof(cap));         for (int j = 0; j <= k; j++)           if (knp[j]) cap[j] = 0;         for (int j = i; j <= k; j++)           if (cap[j] < 0 && cap[j - i] >= 0) cap[j] = cap[j - i] + 1;         for (int j = i; j <= k; j++)           if (cap[j] > 0 && cap[j] <= sizes[i]) knp[j] = true;       }     for (int i = T + 1; i <= k; i++)       for (int j = 0; j < sizes[i]; j++) {         knp |= (knp << i);       }     printf( %d %d , knp[k] ? k : k + 1, s);   }   