intqpow(int bs, int idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = 1ll * bs * bs % kMod) if (idx & 1) ret = 1ll * ret * bs % kMod; return ret; }
intgethash(int *p){ int ret = 0; for (int i = 1; i <= n; ++i) ret = ret * (m + 1) + p[i]; return ret; }
voiddfs(int x){ staticint p[10] = {0}; if (x == n + 1) { int val = gethash(p); mp[val] = ++tot; idx[tot] = val; return; } for (int i = p[x - 1]; i <= m; ++i) { p[x] = i; dfs(x + 1); } }
intgetstate(int a[10][10]){ staticint p[10]; for (int i = n; i; --i) { p[i] = 0; for (int j = m; j; --j) { if (a[i][j] == b[i][j]) { p[i] = m - j + 1; } else { break; } } if (i < n) p[i] = std::min(p[i], p[i + 1]); } return mp[gethash(p)]; }
intwork(int s, int x, int y, int c){ staticint p[10], pp[10][10]; s = idx[s]; for (int i = n; i; --i) { p[i] = s % (m + 1); s /= (m + 1); } for (int i = 1; i <= n; ++i) { for (int j = m; j >= m - p[i] + 1; --j) pp[i][j] = 1; for (int j = 1; j <= m - p[i]; ++j) pp[i][j] = 0; } for (int i = 1; i <= x; ++i) { for (int j = 1; j <= y; ++j) { bool fl = 1; if (x < n) fl &= pp[x + 1][j]; if (y < m) fl &= pp[i][y + 1]; for (int xx = i; xx <= x; ++xx) for (int yy = j; yy <= y; ++yy) fl &= (b[xx][yy] == c); pp[i][j] = fl; } } for (int i = n; i; --i) { p[i] = 0; for (int j = m; j; --j) { if (pp[i][j]) { p[i] = m - j + 1; } else { break; } } if (i < n) p[i] = std::min(p[i], p[i + 1]); } return mp[gethash(p)]; }
voidgauss(){ for (int i = 1; i <= tot; ++i) { if (!w[i][i]) { for (int j = i + 1; j <= tot; ++j) { if (w[j][i]) { std::swap(w[i], w[j]); break; } } } for (int j = i + 1; j <= tot; ++j) { int val = 1ll * w[j][i] * qpow(w[i][i]) % kMod; dec(w[j][0], 1ll * w[i][0] * val % kMod); for (int k = i; k <= tot; ++k) dec(w[j][k], 1ll * w[i][k] * val % kMod); } } for (int i = tot; i; --i) { for (int j = i + 1; j <= tot; ++j) { dec(w[i][0], 1ll * res[j] * w[i][j] % kMod); } res[i] = 1ll * w[i][0] * qpow(w[i][i]) % kMod; } }
voiddickdreamer(){ std::cin >> n >> m; for (int i = 1; i <= n; ++i) { std::string s; std::cin >> s; for (int j = 1; j <= m; ++j) a[i][j] = (s[j - 1] == 'B'); } for (int i = 1; i <= n; ++i) { std::string s; std::cin >> s; for (int j = 1; j <= m; ++j) b[i][j] = (s[j - 1] == 'B'); } dfs(1); int iv = qpow(2 * n * m); for (int i = 1; i <= tot; ++i) { if (i == tot) { w[i][i] = 1; } else { w[i][i] = 1; for (int x = 1; x <= n; ++x) { for (int y = 1; y <= m; ++y) { for (int c = 0; c <= 1; ++c) { int j = work(i, x, y, c); dec(w[i][j], iv); inc(w[i][0], 1ll * x * y * iv % kMod); } } } } } gauss(); std::cout << res[getstate(a)] << '\n'; }