#include #include #include #include #include using namespace std; const int MAXN = 100; int sp, st[MAXN], Tn, n, remain, kol[MAXN]; double C[MAXN][MAXN], fact[MAXN], f[MAXN], g[MAXN], tmp, cache[MAXN]; double ret; inline void calc () { int k_max = 0, carry = 1; for(int i = 1; i <= sp; i++) if (st[i] == st[sp]) ++k_max; for(int i = 0; i <= n; i++) f[i] = (i == 0); for(int k = 1; k <= sp; k++) { for(int i = 0; i <= n; i++) g[i] = 0; for(int i = 0; i <= n; i++) if (f[i]) { for(int b = 1; b <= st[k]; b++) { tmp = (f[i] * C[st[k] - 1][b - 1]); for(int r = 0; r <= b; r++) g[i + st[k] - b - r] += tmp * C[i][r] * C[carry - i][b - r]; } } for(int i = 0; i <= n; i++) f[i] = g[i]; carry += st[k]; } fact[0] = 1; for(int i = 1; i <= n; i++) { fact[i] = fact[i - 1] * 1.0 * i; kol[i] = 0; } for(int i = 1; i <= sp; i++) ++kol[st[i]]; double choose_ways = fact[sp] * C[n][sp]; for(int i = 1; i <= n; i++) choose_ways /= fact[kol[i]]; tmp = f[0] * 1.0 * k_max; tmp /= n; for(int i = 2; i <= n; i++) tmp /= (n - 1); ret += tmp * choose_ways; } void rec (int ai) { remain -= ai; st[++sp] = ai; if (!remain) { calc(); } else for(int i = ai; i <= remain; i++) rec(i); --sp; remain += ai; } int main (int argc, char * const argv[]) { ios_base::sync_with_stdio(false); C[0][0] = 1; for(int i = 1; i <= MAXN; i++) { C[i][0] = 1; for(int j = 1; j <= i; j++) C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } cin >> Tn; assert(1 <= Tn && Tn <= 36); while (Tn--) { cin >> n; if (cache[n] > 0.5) { cout << cache[n] << endl; continue; } assert(1 <= n && n <= 36); remain = n; ret = 0; for(int i = 1; i <= n; i++) rec(i); cout << fixed << setprecision(14); cache[n] = ret; cout << ret << endl; } return 0; }