Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <algorithm>
- using namespace std;
- int q, n;
- double cost;
- float var[4100][4100];
- double ans[4100][4100];
- int p[4100];
- bool used[4100];
- bool g[4100];
- void precalc()
- {
- var[0][0] = 1.;
- for (int i = 1; i < 4050; i++)
- var[i][0] = var[i - 1][0] * (double)i;
- for (int num = 2; num < 4050; num++)
- {
- var[num][1] = (double)(num - 1) * var[num - 1][0];
- for (int sngl = 2; sngl <= num; sngl++)
- {
- var[num][sngl] = (double)(sngl - 1) * var[num - 1][sngl - 2] + (double)(num - sngl) * var[num - 1][sngl - 1];
- }
- }
- ans[0][0] = 0.;
- for (int i = 1; i < 4050; i++)
- ans[i][0] = ans[i - 1][0] + 1. / (double)i;
- for (int i = 1; i < 4050; i++)
- ans[i][1] = ans[i - 1][0];
- for (int num = 2; num < 4050; num++)
- {
- for (int sngl = 2; sngl <= num; sngl++)
- {
- 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];
- // var[num][sngl] = (double)(sngl - 1) * var[num - 1][sngl - 2] + (double)(num - sngl) * var[num - 1][sngl - 1];
- }
- }
- return;
- }
- int main()
- {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- precalc();
- scanf("%d", &q);
- while(q--)
- {
- cin >> n >> cost;
- for (int i = 0; i < n; i++)
- used[i] = g[i] = 0;
- for (int i = 0; i < n; i++)
- {
- cin >> p[i];
- p[i]--;
- if (p[i] != -1)
- g[p[i]] = 1;
- }
- int cycles = 0, sngl = 0, num = 0;
- for (int i = 0; i < n; i++)
- {
- if (g[i])
- continue;
- num++;
- if (p[i] == -1)
- sngl++;
- }
- cycles = -num;
- for (int i = 0; i < n; i++)
- {
- if (used[i])
- continue;
- cycles++;
- int v = i;
- while (v != -1 && !used[v])
- {
- used[v] = 1;
- v = p[v];
- }
- }
- double a = (double)cycles + ans[num][sngl];
- printf("%.10lf\n", a * cost);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement