#include <bits/stdc++.h>
using namespace std;
int n, m;
string A[1000];
double c2(double x) { return x * (x - 1) / 2; }
double c3(double x) { return x * (x - 1) * (x - 2) / 6; }
double g(double a, double b) { return a * c2(b) + b * c2(a); }
int x[1000], y[1000];
int k = 0;
int r[1000], c[1000];
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> A[i];
  memset(r, -1, sizeof(r));
  memset(c, -1, sizeof(c));
  double res = c3(n + 1) * m * m + c3(m + 1) * n * n;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (A[i][j] == 'X') {
        x[k] = i, y[k] = j;
        r[i] = j;
        c[j] = i;
        k++;
      }
  for (int i = 0; i < n; i++)
    if (r[i] != -1) {
      res += 2 * r[i] * (m - 1 - r[i]);
      for (int j = i + 1; j < n; j++) {
        if (r[j] == -1 || r[j] < r[j - 1])
          break;
        else
          res += 2 * r[i] * (m - 1 - r[j]);
      }
      for (int j = i + 1; j < n; j++) {
        if (r[j] == -1 || r[j] > r[j - 1])
          break;
        else
          res += 2 * r[j] * (m - 1 - r[i]);
      }
    }
  for (int j = 0; j < m; j++)
    if (c[j] != -1) {
      res += 2 * c[j] * (n - 1 - c[j]);
      for (int i = j + 1; i < m; i++) {
        if (c[i] == -1 || c[i] < c[i - 1])
          break;
        else
          res += 2 * c[j] * (n - 1 - c[i]);
      }
      for (int i = j + 1; i < m; i++) {
        if (c[i] == -1 || c[i] > c[i - 1])
          break;
        else
          res += 2 * c[i] * (n - 1 - c[j]);
      }
    }
  for (int i = 0; i < k; i++) {
    res -= g(x[i] + 1, y[i] + 1) + g(x[i] + 1, m - y[i]) +
           g(n - x[i], y[i] + 1) + g(n - x[i], m - y[i]);
    res += c2(x[i] + 1) + c2(y[i] + 1) + c2(n - x[i]) + c2(m - y[i]);
  }
  for (int i = 0; i < k; i++)
    for (int j = 0; j < i; j++) {
      res += abs(x[i] - x[j]) + abs(y[i] - y[j]);
    }
  res = res * 2 / (m * n - k) / (m * n - k);
  printf("%.9f\n", res);
}
