1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <cstdio>
#include <cstring>
#include <algorithm>

#define scanf(...) scanf(__VA_ARGS__)?:0

using namespace std;

int n, m, roz, p, wej, sum[5];
char pocz[8][9], kon[8][9];
__int128 wynik;

__int128 newton(int a, int b) {
	__int128 w = 1;
	if (a-b < b) b = a-b;
	for (int i = 0; i < b; i++) w = w * (a - i);
	for (int i = 1; i <= b; i++) w = w / i;
	return w;
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++) scanf(" %s", pocz[i]);
	for (int i = 0; i < n; i++) scanf(" %s", kon[i]);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (pocz[i][j] == 'O') roz += i+j;
			if (kon[i][j] == 'O') {
				roz += i+j;
				p++;
				if (i > 0 && kon[i-1][j] == '.') wej++;
				if (j > 0 && kon[i][j-1] == '.') wej++;
				if (i < n-1 && kon[i+1][j] == '.') wej++;
				if (j < m-1 && kon[i][j+1] == '.') wej++;
			}
		}
	}
	
	if (roz % 2) {
		puts("0");
		return 0;
	}
	
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int ile = 0;
			if (i > 0) ile++;
			if (i < n-1) ile++;
			if (j > 0) ile++;
			if (j < m-1) ile++;
			sum[ile]++;
		}
	}
	
	wynik = (n*(m-1) + m*(n-1)) * newton(n*m-2, p-1);
		
	long double w = (long double) wej / (long double) wynik;
	printf("%.16Lf\n", w);
}