#include #define pb push_back #define mp make_pair #define fi first #define se second using namespace std; typedef long long ll; typedef pair ii; const int MOD = 1000000007; const int N = 1203; int mul(ll a, ll b) { return (a*b)%MOD; } int fat[N]; int ch[N][N]; bool increases[N][N]; int n; int v[N]; int pd[N][N]; int solve(int pos, int lsz) { if (pos >= n) return 1; if (pd[pos][lsz] != -1) return pd[pos][lsz]; int& ret = pd[pos][lsz]; ret = 0; for (int i = pos; i < n and i-pos+1 <= lsz and increases[pos][i]; i++) { int sz = i - pos + 1; ret = (ret%MOD + mul(mul(fat[sz], ch[lsz][sz]), solve(i+1, sz)%MOD))%MOD; } return ret; } int main() { memset(pd, -1, sizeof(pd)); for (int i = 0; i < N; i++) ch[i][0] = 1; fat[0] = 1; for (int i = 1; i < N; i++) { fat[i] = mul(i, fat[i-1]); for (int j = 1; j <= i; j++) ch[i][j] = (ch[i-1][j] + ch[i-1][j-1])%MOD; } scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &v[i]); } for (int i = 0; i < n; i++) { increases[i][i] = true; int pos = i+1; while (pos < n and v[pos] > v[pos-1]) { increases[i][pos] = true; pos++; } } int ans = 0; for (int i = 0; i < n; i++) { if (increases[0][i]) ans = (ans + solve(i+1, i+1))%MOD; } printf("%d\n", ans); return 0; }