#define _CRT_SECURE_NO_WARNINGS #define TASK "insider" #pragma comment(linker, "/STACK:671088640") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MOD = 1000000007; const int INF = 2000000000; const long double EPS = 1e-6; const int HASH_POW = 29; const long double PI = acos(-1.0); mt19937_64 rnd(1); double workTime() { return double(clock()) / CLOCKS_PER_SEC; } void my_return(int code) { #ifdef MYDEBUG cout << "\nTime = " << fixed << setprecision(3) << workTime() << endl; #endif exit(code); } int n, p[1234], f[1234]; int c[1234][1234], dp[1234][1234]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); #ifdef MYDEBUG freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #else /*freopen(TASK".in", "r", stdin); freopen(TASK".out", "w", stdout);*/ /*freopen("pie_progress.txt", "r", stdin); freopen("pie_progress_output.txt", "w", stdout);*/ #endif scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &p[i]); f[0] = 1; for (int i = 1; i < 1234; ++i) f[i] = f[i - 1] * 1ll * i % MOD; c[0][0] = 1; for (int i = 1; i < 1234; ++i) { c[i][0] = 1; for (int j = 1; j <= i; ++j) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD; } for (int r = 1; r <= n; ++r) { bool good = true; for (int j = 1; j < r; ++j) { if (j > 1 && p[r - j + 1] > p[r - j + 2]) { good = false; break; } dp[r][j] = 0; for (int len = j; len <= r; ++len) { int delta = dp[r - j][len] * 1ll * c[len][j] % MOD; delta = delta * 1ll * f[j] % MOD; dp[r][j] = (dp[r][j] + delta) % MOD; } } if (r > 1 && p[1] > p[2]) good = false; if (good) dp[r][r] = 1; else dp[r][r] = 0; } int ans = 0; for (int j = 1; j <= n; ++j) ans = (ans + dp[n][j]) % MOD; printf("%d\n", ans); my_return(0); }