Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<cstdio>
- #include<cstring>
- using namespace std;
- const int MOD=100000;
- struct mint {
- int x;
- mint(int x_=0) : x(x_%MOD) { }
- mint operator+(const mint& o) { return x+o.x; }
- void operator+=(const mint& o) { x=(x+o.x)%MOD; }
- };
- mint dp[2][1<<20][2];
- char F[24][24];
- #define ok(x,y,c) (F[y][x]==c || F[y][x]=='?')
- int main()
- {
- int N, M;
- scanf("%d%d", &N, &M);
- for(int i=0; i<N; ++i) scanf("%s", F[i]);
- if(ok(0,0,'J')) dp[0][0][1]+=1;
- if(ok(0,0,'O')) dp[0][0][0]+=1;
- if(ok(0,0,'I')) dp[0][0][0]+=1;
- int p=1, q=0;
- for(int y=0; y<N; ++y) {
- if(y > 0) memset(dp[p],0,sizeof(dp[p]));
- int high = 1<<(M-1);
- if(y > 0) {
- for(int m=0; m<(1<<M); ++m) {
- if(ok(0,y,'J')) dp[p][(m&~high)>>1][1]+=dp[q][m][0]+dp[q][m][1];
- if(ok(0,y,'O')) dp[p][(m&~high)>>1][0]+=dp[q][m][0]+dp[q][m][1];
- if(ok(0,y,'I') && (m&1)==0) dp[p][(m&~high)>>1][0]+=dp[q][m][0]+dp[q][m][1];
- }
- p=1-p; q=1-q;
- }
- for(int x=1; x<M; ++x) {
- memset(dp[p],0,sizeof(dp[p]));
- for(int m=0; m<(1<<M); ++m) {
- if(ok(x,y,'J')) {
- dp[p][(m&~high)>>1][1]+=dp[q][m][0]+dp[q][m][1];
- }
- if(ok(x,y,'O')) {
- dp[p][(m&~high)>>1][0]+=dp[q][m][0];
- dp[p][(m|high)>>1][0]+=dp[q][m][1];
- }
- if(ok(x,y,'I') && (m&1)==0) {
- dp[p][(m&~high)>>1][0]+=dp[q][m][0]+dp[q][m][1];
- }
- }
- p=1-p; q=1-q;
- }
- }
- int sol=1;
- for(int i=0; i<N; ++i)
- for(int j=0; j<M; ++j)
- if(F[i][j]=='?') sol=(sol*3)%MOD;
- for(int i=0; i<(1<<M); ++i)
- sol = (sol-dp[q][i][0].x-dp[q][i][1].x+2*MOD)%MOD;
- printf("%d\n", sol);
- return 0;
- }
Add Comment
Please, Sign In to add comment