#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1111;
int n, m;
char mat[MAX_N][MAX_N];
void transpose() {
  static char tmp[MAX_N][MAX_N];
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      tmp[m - j - 1][i] = mat[i][j];
    }
  }
  swap(m, n);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      mat[i][j] = tmp[i][j];
    }
  }
}
long long calcUpperLeft() {
  static long long f[MAX_N][MAX_N];
  static int g[MAX_N][MAX_N];
  long long ret = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      f[i][j] = (i ? f[i - 1][j] : 0) + (j ? f[i][j - 1] : 0) -
                (i && j ? f[i - 1][j - 1] : 0);
      g[i][j] = (i ? g[i - 1][j] : 0) + (j ? g[i][j - 1] : 0) -
                (i && j ? g[i - 1][j - 1] : 0);
      if (mat[i][j] == '.') {
        f[i][j] += i + j;
        g[i][j]++;
        if (i && j) {
          ret += (long long)g[i - 1][j - 1] * (i + j) - f[i - 1][j - 1];
        }
      }
    }
  }
  return ret;
}
long long calcSameRow() {
  long long ret = 0;
  for (int i = 0, j, k; i < n; ++i) {
    for (j = 0; j < m && mat[i][j] == '.'; ++j) {
      ret += (1LL + j) * j >> 1;
    }
    for (k = j + 1; k < m; ++k) {
      ret += ((1LL + k) * k >> 1) - (k - j);
      ret += j << 1;
    }
  }
  return ret << 1;
}
long long calcExtra() {
  long long ret = 0, prevSum = 0, lastPos = -1;
  for (int j = 0; j < m; ++j) {
    bool flag = false;
    for (int i = 0; i < n; ++i) {
      if (mat[i][j] == 'X') {
        if (i > lastPos) {
          ret += prevSum * (n - i - 1) * 2;
          prevSum += i;
        } else {
          prevSum = i;
        }
        lastPos = i;
        flag = true;
        break;
      }
    }
    if (!flag) {
      prevSum = 0;
      lastPos = -1;
    }
  }
  return ret << 1;
}
long long calc() {
  long long ret = 0;
  for (int i = 0; i < 4; ++i) {
    ret += calcUpperLeft();
    transpose();
  }
  ret += calcSameRow();
  transpose();
  ret += calcSameRow();
  for (int i = 0; i < 2; ++i) {
    for (int k = 0; k << 1 < n; ++k) {
      for (int l = 0; l < m; ++l) {
        swap(mat[k][l], mat[n - k - 1][l]);
      }
    }
    ret += calcExtra();
    for (int k = 0; k << 1 < n; ++k) {
      for (int l = 0; l < m; ++l) {
        swap(mat[k][l], mat[n - k - 1][l]);
      }
    }
    ret += calcExtra();
    transpose();
  }
  return ret;
}
int main() {
  long long nEmpty = 0;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    scanf("%s", mat[i]);
    for (int j = 0; j < m; ++j) {
      nEmpty += mat[i][j] == '.';
    }
  }
  printf("%.15f\n", (double)calc() / nEmpty / nEmpty);
}
