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