#include using namespace std; const int md = 1000000007; inline void add(int &a, int b) { a += b; if (a >= md) { a -= md; } } inline int mul(int a, int b) { return (long long) a * b % md; } const int N = 1234; int fact[N]; int C[N][N]; int f[N][N]; int a[N]; int main() { fact[0] = 1; for (int i = 1; i < N; i++) { fact[i] = mul(fact[i - 1], i); } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (j == 0) C[i][j] = 1; else if (i == 0) C[i][j] = 0; else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % md; } } int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", a + i); } f[0][n] = 1; for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { if (f[i][j] == 0) { continue; } for (int k = i; k < i + j && k < n; k++) { if (k > i && a[k] < a[k - 1]) { break; } if (i == 0) { add(f[k + 1][k - i + 1], 1); } else { add(f[k + 1][k - i + 1], mul(f[i][j], mul(C[j][k - i + 1], fact[k - i + 1]))); } } } } int ans = 0; for (int j = 1; j <= n; j++) { add(ans, f[n][j]); } printf("%d\n", ans); return 0; }