/* -*- coding: utf-8 -*- * * 663.cc: No.663 セルオートマトンの逆操作 - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 2000; const long long MOD = 1000000007; const bool rls[4][4][2] = { {{1, 0}, {0, 1}, {0, 0}, {0, 0}}, // 000, 001, ---, --- {{0, 0}, {0, 0}, {0, 1}, {0, 1}}, // ---, ---, 010, 011 {{1, 0}, {0, 1}, {0, 0}, {0, 0}}, // 100, 101, ---, --- {{0, 0}, {0, 0}, {0, 1}, {1, 0}}, // ---, ---, 110, 111 }; /* typedef */ typedef long long ll; /* global variables */ int es[MAX_N]; ll dp[MAX_N + 1][4][4]; /* subroutines */ inline void addmod(ll &a, ll b) { a = (a + b) % MOD; } /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &es[i]); for (int k = 0; k < 4; k++) dp[0][k][k] = 1; for (int i = 0; i < n; i++) for (int j = 0; j < 4; j++) for (int k = 0; k < 4; k++) if (dp[i][j][k] > 0) for (int l = 0; l < 4; l++) if (rls[k][l][es[i]]) addmod(dp[i + 1][j][l], dp[i][j][k]); ll sum = 0; for (int k = 0; k < 4; k++) addmod(sum, dp[n][k][k]); printf("%lld\n", sum); return 0; }