#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1010;
char c[MAXN][MAXN];
long long sx[MAXN][MAXN], sy[MAXN][MAXN], cnt[MAXN][MAXN];
inline long long get(long long tab[][MAXN], int a, int b, int cc, int d) {
  if (a > cc || b > d) {
    return 0LL;
  }
  return tab[cc][d] - tab[a - 1][d] - tab[cc][b - 1] + tab[a - 1][b - 1];
}
int main(void) {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%s", c[i] + 1);
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      sx[i][j] = sx[i - 1][j] + sx[i][j - 1] - sx[i - 1][j - 1];
      sy[i][j] = sy[i - 1][j] + sy[i][j - 1] - sy[i - 1][j - 1];
      cnt[i][j] = cnt[i - 1][j] + cnt[i][j - 1] - cnt[i - 1][j - 1];
      if (c[i][j] != 'X') {
        sx[i][j] += i;
        sy[i][j] += j;
        ++cnt[i][j];
      }
    }
  }
  long long res = 0LL;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      if (c[i][j] == 'X') {
        continue;
      }
      res += get(cnt, 1, 1, i - 1, j - 1) * i - get(sx, 1, 1, i - 1, j - 1);
      res += get(cnt, 1, 1, i - 1, j - 1) * j - get(sy, 1, 1, i - 1, j - 1);
      res += get(cnt, 1, j + 1, i - 1, m) * i - get(sx, 1, j + 1, i - 1, m);
      res += get(sy, 1, j + 1, i - 1, m) - get(cnt, 1, j + 1, i - 1, m) * j;
      res += get(sx, i + 1, 1, n, j - 1) - get(cnt, i + 1, 1, n, j - 1) * i;
      res += get(cnt, i + 1, 1, n, j - 1) * j - get(sy, i + 1, 1, n, j - 1);
      res += get(sx, i + 1, j + 1, n, m) - get(cnt, i + 1, j + 1, n, m) * i;
      res += get(sy, i + 1, j + 1, n, m) - get(cnt, i + 1, j + 1, n, m) * j;
    }
  }
  long long sl, sr;
  int last;
  sl = 0;
  sr = 0;
  last = -1;
  for (int i = 1; i <= n; ++i) {
    int d = -1;
    for (int j = 1; j <= m; ++j) {
      if (c[i][j] == 'X') {
        d = j;
        break;
      }
    }
    if (d != -1) {
      if (last == -1 || last > d) {
        sl = 0;
      }
      sl += get(cnt, i, 1, i, d - 1);
    } else {
      sl = 0;
    }
    if (d != -1) {
      if (last == -1 || last < d) {
        sr = 0;
      }
      sr += get(cnt, i, d + 1, i, m);
    } else {
      sr = 0;
    }
    res += (sl * max(0, m - d) + sr * max(d - 1, 0)) * 2;
    last = d;
  }
  sl = sr = 0;
  last = -1;
  for (int i = n; i >= 1; --i) {
    int d = -1;
    for (int j = 1; j <= m; ++j) {
      if (c[i][j] == 'X') {
        d = j;
        break;
      }
    }
    if (d != -1) {
      if (last == -1 || last > d) {
        sl = 0;
      } else {
        res += sl * max(0, m - d) * 2;
      }
      sl += get(cnt, i, 1, i, d - 1);
    } else {
      sl = 0;
    }
    if (d != -1) {
      if (last == -1 || last < d) {
        sr = 0;
      } else {
        res += sr * max(d - 1, 0) * 2;
      }
      sr += get(cnt, i, d + 1, i, m);
    } else {
      sr = 0;
    }
    last = d;
  }
  sl = 0;
  sr = 0;
  last = -1;
  for (int j = 1; j <= m; ++j) {
    int d = -1;
    for (int i = 1; i <= n; ++i) {
      if (c[i][j] == 'X') {
        d = i;
        break;
      }
    }
    if (d != -1) {
      if (last == -1 || last > d) {
        sl = 0;
      }
      sl += get(cnt, 1, j, d - 1, j);
    } else {
      sl = 0;
    }
    if (d != -1) {
      if (last == -1 || last < d) {
        sr = 0;
      }
      sr += get(cnt, d + 1, j, n, j);
    } else {
      sr = 0;
    }
    res += (sl * max(n - d, 0) + sr * max(d - 1, 0)) * 2;
    last = d;
  }
  sl = sr = 0;
  last = -1;
  for (int j = m; j >= 1; --j) {
    int d = -1;
    for (int i = 1; i <= n; ++i) {
      if (c[i][j] == 'X') {
        d = i;
        break;
      }
    }
    if (d != -1) {
      if (last == -1 || last > d) {
        sl = 0;
      } else {
        res += sl * max(n - d, 0) * 2;
      }
      sl += get(cnt, 1, j, d - 1, j);
    } else {
      sl = 0;
    }
    if (d != -1) {
      if (last == -1 || last < d) {
        sr = 0;
      } else {
        res += sr * max(d - 1, 0) * 2;
      }
      sr += get(cnt, d + 1, j, n, j);
    } else {
      sr = 0;
    }
    last = d;
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      if (c[i][j] != 'X') {
        res += get(cnt, i, 1, i, j - 1) * j - get(sy, i, 1, i, j - 1);
        res += get(sy, i, j + 1, i, m) - get(cnt, i, j + 1, i, m) * j;
      }
    }
  }
  for (int j = 1; j <= m; ++j) {
    for (int i = 1; i <= n; ++i) {
      if (c[i][j] != 'X') {
        res += get(cnt, 1, j, i - 1, j) * i - get(sx, 1, j, i - 1, j);
        res += get(sx, i + 1, j, n, j) - get(cnt, i + 1, j, n, j) * i;
      }
    }
  }
  long long Z = get(cnt, 1, 1, n, m);
  Z *= Z;
  long double R = (long double)res / Z;
  printf("%.10lf\n", (double)R);
  return 0;
}
