func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long inf = 2147383647;   const double pi = 2 * acos(0.0);   const double eps = 1e-9;   struct debugger {     template <typename T>     debugger& operator,(const T& v) {       cerr << v <<    ;       return *this;     }   } dbg;   inline long long gcd(long long a, long long b) {     a = ((a) < 0 ? -(a) : (a));     b = ((b) < 0 ? -(b) : (b));     while (b) {       a = a % b;       swap(a, b);     }     return a;   }   int ext_gcd(int a, int b, int& x, int& y) {     if (a == 0) {       x = 0;       y = 1;       return b;     }     int x1, y1;     int d = ext_gcd(b % a, a, x1, y1);     x = y1 - (b / a) * x1;     y = x1;     return d;   }   inline long long modInv(int a, int m) {     int x, y;     ext_gcd(a, m, x, y);     if (x < 0) x += m;     return x;   }   inline long long power(long long a, long long p) {     long long res = 1, x = a;     while (p) {       if (p & 1) res = (res * x);       x = (x * x);       p >>= 1;     }     return res;   }   inline long long bigmod(long long a, long long p, long long m) {     long long res = 1, x = a % m;     while (p) {       if (p & 1) res = (res * x) % m;       x = (x * x) % m;       p >>= 1;     }     return res;   }   char buf[60][30];   long long mask[1 << 20];   int m;   double q;   double memo[1 << 20];   int done[1 << 20];   double dp(int mk) {     int pop = 0;     if (mask[mk]) pop = __builtin_popcountll(mask[mk]);     int pop2 = __builtin_popcountll(mk);     if (pop <= 1) return 0;     if (done[mk]) return memo[mk];     double p = 1.0 / (m - pop2);     double res = 0;     for (int i = (0); i <= (m - 1); ++i) {       if (mk & (1 << i)) continue;       res += p * dp(mk | (1 << i));       long long x = mask[mk | (1 << i)];       x = x ^ mask[mk];       x = __builtin_popcountll(x);       res += p * x * q * (pop2 + 1);     }     done[mk] = 1;     return memo[mk] = res;   }   int main() {     int n;     scanf( %d , &n);     q = 1.0 / n;     for (int i = (0); i <= (n - 1); ++i) {       scanf( %s , &buf[i][0]);     }     m = strlen(&buf[0][0]);     for (int i = (0); i <= (n - 1); ++i) {       for (int j = (i + 1); j <= (n - 1); ++j) {         int tmask = 0;         for (int k = (0); k <= (m - 1); ++k) {           if (buf[i][k] == buf[j][k]) tmask |= (1LL << k);         }         mask[tmask] |= (1LL << i);         mask[tmask] |= (1LL << j);       }     }     int limit = 1 << m;     for (int i = (limit - 1); i >= (0); --i) {       for (int k = (0); k <= (m - 1); ++k) {         if (i & (1 << k)) {           mask[i ^ (1 << k)] |= mask[i];         }       }     }     double res = dp(0);     printf( %.10lf n , res);     return 0;   }   