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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>

using namespace std;

long long F(int n, int k) {
    if(n < k) return 0;
    long long ans = 1;
    for(int i=1; i<=k; ++i) {
        ans *= (n-i+1);
        ans /= i;
    }
    return ans;
}

int main() {
    int N,M;
    cin>>N>>M;
    string S[8];
    for(int i=0; i<N; ++i) cin>>S[i];
    int PPP = 0;
    for(int i=0; i<N; ++i) for(int j=0; j<M; ++j) {
        if(S[i][j] == 'O') {
            PPP += i+j;
        }
    }
    for(int i=0; i<N; ++i) cin>>S[i];
    int K = 0;
    for(int i=0; i<N; ++i) for(int j=0; j<M; ++j) if(S[i][j] == 'O') K++;
    long long E,O;
    E = O = 0;
    for(int i=0; i<N; ++i)
    for(int j=0; j<M; ++j) {
        int L = 0;
        if(i-1 >= 0) L++;
        if(i+1 < N) L++;
        if(j-1 >= 0) L++;
        if(j+1 < M) L++;
        for(int k=0; k<L; ++k) {
            int P;
            int Ke,Ko;
            if(N*M % 2 == 0) {
                Ke = Ko = N*M / 2;
            }
            else {
                Ke = N*M / 2 + 1;
                Ko = N*M / 2;
            }
            P = i + j;
            if(P % 2 == 0) {
                P += k;
                Ke--;
                Ko -= L;
            }
            else {
                Ke -= L;
                Ko--;
            }
            if(K >= k+1) {
                int G = K - k - 1;
                for(int g=0; g<=G; ++g) {
                    if((P + G - g) % 2 == 0) E += F(L,k)*(L-k)*F(Ke,g)*F(Ko,G-g);
                    else O += F(L,k)*(L-k)*F(Ke,g)*F(Ko,G-g);
                }
            }
        }
    }
    int PP,Liczba;
    PP = Liczba = 0;
    for(int i=0; i<N; ++i) for(int j=0; j<M; ++j) {
        if(S[i][j] == 'O') {
            PP += i+j;
            if(i-1 >= 0 && S[i-1][j] == '.') Liczba++;
            if(i+1 < N && S[i+1][j] == '.') Liczba++;
            if(j-1 >= 0 && S[i][j-1] == '.') Liczba++;
            if(j+1 < M && S[i][j+1] == '.') Liczba++;
        }
    }
    //cout<<Liczba<<" "<<PP<<" "<<E<<" "<<O<<endl;
    long double ans;
    ans = (long double)Liczba;
    if(PP % 2 == 0) ans /= E;
    else ans /= O;
    cout.precision(15);
    if(PP % 2 == PPP % 2) cout<<fixed<<ans<<endl;
    else cout<<0<<endl;
    
    return 0;
}