#include #define endl '\n' using namespace std; const int MAXN = (1 << 11); const int64_t mod = (int64_t)1e9 + 7; int n; int a[MAXN]; void read() { cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; } int64_t fact[MAXN], dp[MAXN][MAXN], C[MAXN][MAXN]; void solve() { C[0][0] = 1; for(int i = 1; i <= n + 42; i++) { C[i][0] = 1; for(int j = 1; j <= i; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod; } fact[0] = 1; for(int i = 1; i <= n + 42; i++) fact[i] = (fact[i - 1] * i) % mod; for(int i = 1; i <= n + 42; i++) for(int k = 1; k <= n + 42; k++) C[i][k] = (C[i][k] * fact[k]) % mod; for(int i = 0; i < n; i++) { for(int j = i; j >= 0; j--) if(j == i || a[j] < a[j + 1]) { if(j == 0) { dp[i][i - j + 1] = 1; break; } int bound = min(n, min((i - j + 1) + 1200, j + 2)); for(int k = (i - j + 1); k <= bound; k++) dp[i][i - j + 1] = (dp[i][i - j + 1] + C[k][(i - j + 1)] * dp[j - 1][k]) % mod; } else break; } int64_t ans = 0; for(int i = 0; i <= n; i++) ans = (ans + dp[n - 1][i]) % mod; cout << ans << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); read(); solve(); return 0; }