//Sylwia Sapkowska #include <bits/stdc++.h> using namespace std; void __print(int x) {cerr << x;} void __print(long long x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << '\'' << x << '\'';} void __print(const char *x) {cerr << '\"' << x << '\"';} void __print(const string &x) {cerr << '\"' << x << '\"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} #ifndef ONLINE_JUDGE #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else #define debug(x...) #endif #define int long long const int oo = 1e18, oo2 = 1e9+7, K = 30; const int mod = 998244353; int n, m; vector<int>X = {-1, 1, 0, 0}; vector<int>Y = {0, 0, -1, 1}; int ile(vector<vector<char>>a){ int curr = 0; for (int i = 1; i<=n; i++){ for (int j = 1; j<=m; j++){ if (a[i][j] == 'O'){ // debug(i, j); for (int k = 0; k<4; k++){ pair<int, int>s = {i+X[k], j+Y[k]}; if (s.first >= 1 && s.second >= 1 && s.first <= n && s.second <= m){ if (a[s.first][s.second] == '.'){ // debug(s); curr++; } } } } } } return curr; } void solve(){ cin >> n >> m; int k = 0; int A0 = 0, A1 = 0, B0 = 0, B1 = 0; vector<vector<char>>a(n+1, vector<char>(m+1)); vector<vector<char>>b(n+1, vector<char>(m+1)); for (int i = 1; i<=n; i++){ for (int j = 1; j<=m; j++){ cin >> a[i][j]; if (a[i][j] == 'O'){ k++; if ((i+j)&1) A0++; else A1++; } } } string s; getline(cin, s); for (int i = 1; i <= n; i++){ for (int j = 1; j<=m; j++){ cin >> b[i][j]; if (b[i][j] == 'O'){ if ((i+j)&1) B0++; else B1++; } } } if ((A0-B0)%2 != 0 || (A1-B1)%2 != 0){ cout << "0\n"; return; } vector<vector<int>>c(n*m+2, vector<int>(n*m+2)); c[0][0] = 1; for (int i = 1; i<=n*m; i++){ c[i][i] = c[i][0] = 1; for (int j = 1; j<i; j++){ c[i][j] = c[i-1][j] + c[i-1][j-1]; } } int ans = c[n*m-2][k-1] * (n*(m-1) + m*(n-1)); // debug(ile(b)); cout << fixed << setprecision(15) << (long double)(ile(b))/ans << "\n"; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); 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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | //Sylwia Sapkowska #include <bits/stdc++.h> using namespace std; void __print(int x) {cerr << x;} void __print(long long x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << '\'' << x << '\'';} void __print(const char *x) {cerr << '\"' << x << '\"';} void __print(const string &x) {cerr << '\"' << x << '\"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} #ifndef ONLINE_JUDGE #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else #define debug(x...) #endif #define int long long const int oo = 1e18, oo2 = 1e9+7, K = 30; const int mod = 998244353; int n, m; vector<int>X = {-1, 1, 0, 0}; vector<int>Y = {0, 0, -1, 1}; int ile(vector<vector<char>>a){ int curr = 0; for (int i = 1; i<=n; i++){ for (int j = 1; j<=m; j++){ if (a[i][j] == 'O'){ // debug(i, j); for (int k = 0; k<4; k++){ pair<int, int>s = {i+X[k], j+Y[k]}; if (s.first >= 1 && s.second >= 1 && s.first <= n && s.second <= m){ if (a[s.first][s.second] == '.'){ // debug(s); curr++; } } } } } } return curr; } void solve(){ cin >> n >> m; int k = 0; int A0 = 0, A1 = 0, B0 = 0, B1 = 0; vector<vector<char>>a(n+1, vector<char>(m+1)); vector<vector<char>>b(n+1, vector<char>(m+1)); for (int i = 1; i<=n; i++){ for (int j = 1; j<=m; j++){ cin >> a[i][j]; if (a[i][j] == 'O'){ k++; if ((i+j)&1) A0++; else A1++; } } } string s; getline(cin, s); for (int i = 1; i <= n; i++){ for (int j = 1; j<=m; j++){ cin >> b[i][j]; if (b[i][j] == 'O'){ if ((i+j)&1) B0++; else B1++; } } } if ((A0-B0)%2 != 0 || (A1-B1)%2 != 0){ cout << "0\n"; return; } vector<vector<int>>c(n*m+2, vector<int>(n*m+2)); c[0][0] = 1; for (int i = 1; i<=n*m; i++){ c[i][i] = c[i][0] = 1; for (int j = 1; j<i; j++){ c[i][j] = c[i-1][j] + c[i-1][j-1]; } } int ans = c[n*m-2][k-1] * (n*(m-1) + m*(n-1)); // debug(ile(b)); cout << fixed << setprecision(15) << (long double)(ile(b))/ans << "\n"; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; } |