#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int cntX[N], cntY[N];
char row[N][N];
int blkX[N], blkY[N];
inline int iabs(int x) { return x > 0 ? x : -x; }
int main() {
  int n, m;
  long long sum = 0, cnt;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) cntX[i] = m;
  for (int i = 0; i < m; i++) cntY[i] = n;
  cnt = m * n;
  for (int i = 0; i < n; i++) {
    scanf("%s", row[i]);
    blkX[i] = -1;
    for (int j = 0; j < m; j++) {
      if (row[i][j] == 'X') {
        --cnt;
        --cntX[i], --cntY[j];
        blkX[i] = j;
      }
    }
  }
  for (int j = 0; j < m; j++) {
    for (int i = 0; i < n; i++) {
      if (row[i][j] == 'X') blkY[j] = i;
    }
  }
  int l0 = 0, r0 = 0, lst = -1;
  for (int i = 0; i < n; i++) {
    if (blkX[i] == -1)
      l0 = r0 = 0, lst = -1;
    else {
      int tl = blkX[i], tr = m - tl - 1;
      if (lst != -1) {
        if (lst < blkX[i])
          l0 += tl, r0 = tr, sum += 4 * tr * l0;
        else
          r0 += tr, l0 = tl, sum += 4 * tl * r0;
      } else
        l0 = tl, r0 = tr, sum += 4 * tl * tr;
      lst = blkX[i];
    }
  }
  l0 = r0 = 0, lst = -1;
  for (int i = 0; i < m; i++) {
    if (blkY[i] == -1)
      l0 = r0 = 0, lst = -1;
    else {
      int tl = blkY[i], tr = n - tl - 1;
      if (lst != -1) {
        if (lst < blkY[i])
          l0 += tl, r0 = tr, sum += 4 * tr * l0;
        else
          r0 += tr, l0 = tl, sum += 4 * tl * r0;
      } else
        l0 = tl, r0 = tr, sum += 4 * tl * tr;
      lst = blkY[i];
    }
  }
  cnt *= cnt;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      sum += (long long)iabs(j - i) * cntX[i] * cntX[j];
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++)
      sum += (long long)iabs(j - i) * cntY[i] * cntY[j];
  printf("%.10f\n", (double)sum / cnt);
  return 0;
}
