import collections MAXN = 2001 mod = 10**9 + 7 fac = [1] for k in range(1, MAXN): fac.append(fac[-1] * k % mod) nCr_memo = [[0] * MAXN for _ in range(MAXN)] nCr_memo[0][0] = 1 for n in range(1, MAXN): nCr_memo[n][0] = 1 nCr_memo[n][n] = 1 for r in range(1, n): nCr_memo[n][r] = (nCr_memo[n - 1][r - 1] + nCr_memo[n - 1][r]) % mod def nCr(n, r): if r < 0: return 0 return nCr_memo[n][r] def read_data(): N = int(input()) Ss = [input() for i in range(N)] return N, Ss def common_prefix(S1, S2): for i in range(min(len(S1), len(S2))): if S1[i] != S2[i]: return i return min(len(S1), len(S2)) def preprocess(N, Ss): Ss.sort() mat = [[0] * N for _ in range(N)] for i in range(N): for j in range(i + 1, N): mat[i][j] = common_prefix(Ss[i], Ss[j]) + 1 mat[j][i] = mat[i][j] return mat def preprocess2(N, mat): fs = [] for i in range(N): counter = collections.Counter(mat[i]) lst = list(counter.items()) lst.sort() fL = 0 fH = N - 1 data = [] for j, fj in lst[1:]: fH -= fj data.append((j, fj, fL, fH)) fL += fj fs.append(data) return fs def solve(N, Ss): mat = preprocess(N, Ss) fs = preprocess2(N, mat) ans = [0] for k in range(N - 1): cum = (ans[-1] * (N - k)) % mod for f in fs: for j, fj, fL, fH in f: cum = (cum + j * (nCr(fL + fj, k - fH) - nCr(fL, k - fH - fj)) * fac[k]) % mod ans.append(cum) cum = (ans[-1] + fac[N]) % mod ans.append(cum) return ans N, Ss = read_data() ans = solve(N, Ss) for a in ans[1:]: print(a)