func_code_string: #include <bits/stdc++.h>   using namespace std;   const int INF = 0x3fffffff;   const long long _INF = 0x7ffffffffffffffll;   const double EPS = 1e-9;   const double PI = acos(-1.0);   template <class T, class INT>   inline T pow(T x, INT y) {     T res(1);     for (T tt(x); y; y /= 2) {       if (y & 1) res *= tt;       tt *= tt;     }     return res;   }   template <class T, class INT>   inline T pow(T x, INT y, T p) {     T res(1);     for (T tt(x); y; y /= 2) {       if (y & 1) res = res * tt % p;       tt = tt * tt % p;     }     return res;   }   int toInt(string s) {     int x = 0;     istringstream sin(s);     sin >> x;     return x;   }   template <class T>   inline string toString(T x) {     ostringstream sout;     sout << x;     return sout.str();   }   template <class INT>   inline INT gcd(INT x, INT y) {     return y ? gcd(y, x % y) : x;   }   template <class INT>   inline int calc_bits(INT x) {     return x ? (x & 1) + calc_bits(x >> 1) : 0;   }   const int MAXN = 1000 + 10;   int n, m, cnt, r[MAXN], c[MAXN], u[MAXN], d[MAXN];   string a[MAXN];   double ans;   inline long long calc(int x, int n) {     return (n - x) * (n - x - 1) / 2 + (x + 1) * x / 2;   }   int main(int argc, char* argv[]) {     cin >> n >> m;     for (int i = 0; i < (n); ++i) cin >> a[i];     cnt = n * m;     memset(r, 255, sizeof(r)), memset(c, 255, sizeof(c));     for (int i = 0; i < (n); ++i)       for (int j = 0; j < (m); ++j)         if (a[i][j] ==  X ) r[i] = j, c[j] = i, --cnt;     for (int i = 0; i < (n); ++i) {       u[i] = r[i];       d[i] = m - r[i] - 1;       if (r[i] != -1) {         if (i && r[i - 1] != -1 && r[i - 1] < r[i]) u[i] += u[i - 1];         if (i && r[i - 1] != -1 && r[i - 1] > r[i]) d[i] += d[i - 1];       }     }     for (int i = (n - 1); i > (-1); --i)       if (r[i] != -1) {         if (i < n - 1 && r[i + 1] != -1 && r[i + 1] < r[i]) u[i] += u[i + 1];         if (i < n - 1 && r[i + 1] != -1 && r[i + 1] > r[i]) d[i] += d[i + 1];       }     for (int i = 0; i < (m); ++i) ans += n * n * calc(i, m);     for (int i = 0; i < (n); ++i)       for (int j = 0; j < (n); ++j) {         ans += (r[i] == -1 ? m : m - 1) * (r[j] == -1 ? m : m - 1) * abs(i - j);         if (i == j && r[i] != -1)           ans += 2 * (u[i] * (m - r[i] - 1) + d[i] * r[i]);         if (r[i] != -1) ans -= calc(r[i], m);         if (r[j] != -1) ans -= calc(r[j], m);         if (r[i] != -1 && r[j] != -1) ans += abs(r[i] - r[j]);       }     for (int i = 0; i < (m); ++i) {       u[i] = c[i];       d[i] = n - c[i] - 1;       if (c[i] != -1) {         if (i && c[i - 1] != -1 && c[i - 1] < c[i]) u[i] += u[i - 1];         if (i && c[i - 1] != -1 && c[i - 1] > c[i]) d[i] += d[i - 1];       }     }     for (int i = (m - 1); i > (-1); --i)       if (c[i] != -1) {         if (i < m - 1 && c[i + 1] != -1 && c[i + 1] < c[i]) u[i] += u[i + 1];         if (i < m - 1 && c[i + 1] != -1 && c[i + 1] > c[i]) d[i] += d[i + 1];       }     for (int i = 0; i < (m); ++i)       if (c[i] != -1) ans += 2 * (u[i] * (n - c[i] - 1) + d[i] * c[i]);     cout << setprecision(8) << fixed << ans / cnt / cnt << endl;   }   