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
#include<iostream>
#include<iomanip>
using namespace std;
int p[2][2];//reszta x mod 2, reszta y mod 2
long long dn(int n, int k){//zal: n>k
    long long w=1;
    for(long long i=n; i>n-k; i--){
        w*=i;
    }
    for(long long i=2; i<=k; i++){
        w/=i;
    }
    return w;
}
int main(){
    //ios_base::sync_with_stdio(0);
    //cin.tie(0);
    int n, m;
    cin>>n>>m;
    char przed[n][m];
    char po[n][m];
    int suma_x1=0, suma_y1=0, suma_x2=0, suma_y2=0;
    int k=0;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            p[i%2][j%2]++;
            cin>>przed[i][j];
            if(przed[i][j]=='O'){
                suma_x1+=j;
                suma_y1+=i;
                k++;
            }
        }
    }
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin>>po[i][j];
            if(po[i][j]=='O'){
                suma_x2+=j;
                suma_y2+=i;
            }
        }
    }
    if((suma_x1+suma_y1)%2!=(suma_x2+suma_y2)%2){
        cout<<0;
        return 0;
    }
    long long mianownik=0;
    for(int a=0; a<=p[0][0]; a++){
        for(int b=0; b<=p[0][1]; b++){
            for(int c=0; c<=p[1][0]; c++){
                for(int d=0; d<=p[1][1]; d++){
                    cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n';
                    if(a+b+c+d==k && (b+c+2*d)%2==(suma_x1+suma_y1)%2){
                        mianownik+=dn(p[0][0], a)*dn(p[0][1], b)*dn(p[1][0], c)*dn(p[1][1], d);
                    }

                }
            }
        }
    }
    long double temp=1;
    long double temp2=mianownik;
    temp/=temp2;
    cout<<setprecision(13)<<fixed;
    cout<<temp;
}