-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathE.cpp
38 lines (38 loc) · 872 Bytes
/
E.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <algorithm>
#include <cstdio>
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int K, M;
while (cin >> K >> M) {
vector<int> col(M);
for (int i = 0; i < M; i++) cin >> col[i];
double hands = 0.0, matched = 0.0;
vector<int> v(K);
vector<double> fact(K);
function<void(int,int)> rec = [&] (int i, int x) {
if (i < K) {
for (v[i] = x; v[i] < M; v[i]++) rec(i+1, v[i]);
return;
}
double h = 1.0, m = 0.0;
for (int i = 0, last = -1, n = 1; i < K; i++) {
if (v[i] == last) n++; else n = 1;
last = v[i];
fact[i] = double(col[v[i]]-(n-1)) / n;
h *= fact[i];
}
if (h == 0.0) return;
for (int i = 0; i < K; i++) if (i == K-1 || v[i] != v[i+1]) {
m += h/fact[i];
}
for (int i = 1; i <= K-1; i++) m *= i;
hands += h;
matched += min(h, m);
};
rec(0, 0);
printf("%.12lf\n", matched/hands);
}
}