#include <bits/stdc++.h>
inline int read() {
  int ret;
  scanf("%d", &ret);
  return ret;
}
int dx[8] = {1, 1, 0, -1, -1, -1, 0, 1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
using namespace std;
string s[55];
double p[55];
void makeP(int n) {
  p[0] = 1.0;
  for (int i = 1; i <= int(n); i++) {
    p[i] = 1.0;
    for (int j = 1; j <= int(i); j++) p[i] *= 1.0 * (i - j + 1) / (n - i + j);
  }
}
int n;
int num[1 << 20];
void makeNum(int k = 16) {
  for (int i = 0; i < int(1 << k); i++) num[i] = num[i >> 1] + (i & 1);
}
inline int getOne(long long val) {
  return num[val & 0XFFFF] + num[(val >> 16) & 0XFFFF] +
         num[(val >> 32) & 0XFFFF] + num[(val >> 48) & 0XFFFF];
}
long long has[1 << 20];
void makeHas() {
  int l = s[0].length();
  has[0] = (1ll << n) - 1;
  for (int i = 0; i < int(n); i++)
    for (int j = 0; j < int(n); j++)
      if (i != j) {
        int same = 0;
        for (int k = 0; k < int(l); k++)
          if (s[i][k] == s[j][k]) same |= 1 << k;
        has[same] |= 1ll << i;
      }
  for (int st = (1 << l) - 1; st >= 0; st--) {
    int ns = st;
    while (ns) {
      int j = ns & (-ns);
      has[st ^ j] |= has[st];
      ns ^= j;
    }
  }
}
double makeAns() {
  if (n == 1) return 0;
  double ret = 0.0;
  int l = s[0].length();
  for (int st = 0; st < int(1 << l); st++) {
    int ns = st;
    int One = getOne(has[st]);
    while (ns) {
      int j = ns & (-ns);
      ns ^= j;
      int cnt = getOne(has[st ^ j]) - One;
      if (cnt == 0) continue;
      int t = getOne(st ^ j);
      ret += 1.0 * cnt * (t + 1) * p[t] / (l - t) / n;
    }
  }
  return ret;
}
int Main() {
  cin >> n;
  for (int i = 0; i < int(n); i++) cin >> s[i];
  makeNum();
  makeHas();
  makeP(s[0].length());
  double ans = makeAns();
  cout << fixed << setprecision(10) << ans << endl;
  return 0;
}
int main() { return Main(); }
