module main; // https://kmjp.hatenablog.jp/entry/2015/02/18/0900 より // ARC028、戻すDP import std; void main() { // 入力 int N; long L; readln.chomp.formattedRead("%d %d", N, L); L *= 60; // 時間から分に変換 long sum = 0; auto S = new long[](N); auto str = readln.split.to!(string[]); foreach (i; 0 .. N) { int x, y; str[i].formattedRead("%d:%d", x, y); S[i] = x * 60 + y; sum += S[i]; } // 答えの計算と出力 if (L >= sum) { writeln(N); return; } auto fact = new double[](80); fact[0] = fact[1] = 1; foreach (i; 2 .. 80) fact[i] = fact[i - 1] * i; auto dp = new long[][](22_005, 53); dp[0][0] = 1; foreach (i; 0 .. N) { foreach_reverse (x; 0 .. i + 1) { foreach (y; 0 .. 22_001) dp[min(22_000, y + S[i])][x + 1] += dp[y][x]; } } auto dp2 = new long[][](22_005, 53); double ans = 0; foreach (i; 0 .. N) { foreach (x; 0 .. N + 1) { foreach (y; 0 .. L + S[i]) { dp2[y][x] = dp[y][x]; if (y >= S[i] && x > 0) dp2[y][x] -= dp2[y - S[i]][x - 1]; if (x < N && y < L) ans += dp2[y][x] * fact[x] * fact[N - (x + 1)]; } } } ans /= fact[N]; writefln("%.12f", ans); }