#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;
}
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; } |
English