Advertisement
Um_nik

Untitled

Sep 14th, 2014
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int q, n;
  8. double cost;
  9. float var[4100][4100];
  10. double ans[4100][4100];
  11. int p[4100];
  12. bool used[4100];
  13. bool g[4100];
  14.  
  15. void precalc()
  16. {
  17.     var[0][0] = 1.;
  18.     for (int i = 1; i < 4050; i++)
  19.         var[i][0] = var[i - 1][0] * (double)i;
  20.     for (int num = 2; num < 4050; num++)
  21.     {
  22.         var[num][1] = (double)(num - 1) * var[num - 1][0];
  23.         for (int sngl = 2; sngl <= num; sngl++)
  24.         {
  25.             var[num][sngl] = (double)(sngl - 1) * var[num - 1][sngl - 2] + (double)(num - sngl) * var[num - 1][sngl - 1];
  26.         }
  27.     }
  28.     ans[0][0] = 0.;
  29.     for (int i = 1; i < 4050; i++)
  30.         ans[i][0] = ans[i - 1][0] + 1. / (double)i;
  31.     for (int i = 1; i < 4050; i++)
  32.         ans[i][1] = ans[i - 1][0];
  33.     for (int num = 2; num < 4050; num++)
  34.     {
  35.         for (int sngl = 2; sngl <= num; sngl++)
  36.         {
  37.             ans[num][sngl] = (double)(sngl - 1) * var[num - 1][sngl - 2] / var[num][sngl] * ans[num - 1][sngl - 2] + (double)(num - sngl) * var[num - 1][sngl - 1] / var[num][sngl] * ans[num - 1][sngl - 1];
  38. //          var[num][sngl] = (double)(sngl - 1) * var[num - 1][sngl - 2] + (double)(num - sngl) * var[num - 1][sngl - 1];
  39.         }
  40.     }
  41.     return;
  42. }
  43.  
  44. int main()
  45. {
  46. //  freopen("input.txt", "r", stdin);
  47. //  freopen("output.txt", "w", stdout);
  48.  
  49.     precalc();
  50.  
  51.     scanf("%d", &q);
  52.     while(q--)
  53.     {
  54.         cin >> n >> cost;
  55.         for (int i = 0; i < n; i++)
  56.             used[i] = g[i] = 0;
  57.         for (int i = 0; i < n; i++)
  58.         {
  59.             cin >> p[i];
  60.             p[i]--;
  61.             if (p[i] != -1)
  62.                 g[p[i]] = 1;
  63.         }
  64.         int cycles = 0, sngl = 0, num = 0;
  65.         for (int i = 0; i < n; i++)
  66.         {
  67.             if (g[i])
  68.                 continue;
  69.             num++;
  70.             if (p[i] == -1)
  71.                 sngl++;
  72.         }
  73.         cycles = -num;
  74.         for (int i = 0; i < n; i++)
  75.         {
  76.             if (used[i])
  77.                 continue;
  78.             cycles++;
  79.             int v = i;
  80.             while (v != -1 && !used[v])
  81.             {
  82.                 used[v] = 1;
  83.                 v = p[v];
  84.             }
  85.         }
  86.         double a = (double)cycles + ans[num][sngl];
  87.         printf("%.10lf\n", a * cost);
  88.     }
  89.  
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement