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
| #include<bits/stdc++.h> using namespace std; #ifdef LOCAL #define debug(...) fprintf(stdout, ##__VA_ARGS__) #else #define debug(...) void(0) #endif #define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back #define fi first #define se second
#define mo 998244353
int pw(int a, int b) { int ans=1; while(b) { if(b&1) ans*=a; a*=a; b>>=1; ans%=mo; a%=mo; } return ans; } inline void Mod(int &a) { if(a>=mo || a<=-mo) a%=mo; if(a<0) a+=mo; } inline void Add(int &a, int b) { a+=b; Mod(a); } inline void Mul(int &a, int b) { Mod(b); a*=b; Mod(a); } const int iv2=pw(2, mo-2); int n, m, i, j, k, T; int ans, sum, o, nwk, A, s, f[8][2][1<<7][1210]; int g[8][1<<7][1210]; char str[7][110];
int qu(int s, int t) { if(t == 0) return 0; return (s >> (t-1)) & 1; }
int fu(int o) { return o ? -1 : 1; }
int huan(int s, int i, int o) { int k = s & (1 << (i - 1));
return s - k + (o << (i - 1)); }
signed main() { freopen("destroy.in", "r", stdin); freopen("destroy.out", "w", stdout); #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif
n = read(); m = read(); A = 2 * n * m - n - m; debug("A : %lld\n", A); for(i = 1; i <= n; ++i) { scanf("%s", str[i] + 1); } f[n + 1][0][0][0] = -1; for(j = 1; j <= m; ++j) { for(i = 1; i <= n + 1; ++i) for(s = 0; s < (1 << n); ++s) for(k = 0; k <= A; ++k) { g[i][s][k] = f[i][(j - 1) & 1][s][k]; f[i][j & 1][s][k] = f[i][(j - 1) & 1][s][k] = 0; } for(i = 1; i <= n; ++i) for(s = 0; s < (1 << n); ++s) for(k = 0; k <= A; ++k) { if(i == 1) f[i][j & 1][s][k] = g[n + 1][s][k]; for(o = 0; o <= 1; ++o) { if(o && str[i][j] != '*') continue; int f1 = o | qu(s, i), nwk = k; int f2 = o | qu(s, i-1); if(j-1 >= 1 && f1) ++nwk; if(i-1 >= 1 && f2) ++nwk; if(f[i][j & 1][s][k]) { debug("%lld => [[%lld %lld] %lld | %lld]\n", fu(o) * f[i][j & 1][s][k], i + 1, j, huan(s, i, o), nwk); } Add(f[i + 1][j & 1][huan(s, i, o)][nwk], fu(o) * f[i][j & 1][s][k]); } if(f[i][j & 1][s][k]) debug("f[%lld %lld][%lld][%lld] = %lld\n", i, j, s, k, f[i][j & 1][s][k]); } debug("========== %lld\n", f[2][j & 1][1][1]); } for(k = 1; k <= A; ++k) { int sum = 0; for(s = 0; s < (1 << n); ++s) Add(sum, f[n + 1][m & 1][s][k]); debug("%lld : %lld\n", k, sum); Add(ans, A * pw(k, mo - 2) % mo * sum % mo); } printf("%lld", ans); return 0; }
|