#include #include #include #include #include #include #include #include using namespace std; const int mod = 1e9 + 7; struct modint { int n; modint(int n = 0) : n(n) {} }; modint operator+(modint a, modint b) { return modint((a.n += b.n) >= mod ? a.n - mod : a.n); } modint operator-(modint a, modint b) { return modint((a.n -= b.n) < 0 ? a.n + mod : a.n); } modint operator*(modint a, modint b) { return modint(1LL * a.n * b.n % mod); } modint &operator+=(modint &a, modint b) { return a = a + b; } modint dp[1212][1212]; // pos, prevlen modint fact[1212]; modint invfact[1212]; modint inv[1212]; modint P(int n, int r) { return fact[n] * invfact[n - r]; } int main() { int n; cin >> n; vector a(n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); inv[1] = 1; for (int i = 2; i < 1212; i++) { inv[i] = inv[mod % i] * (mod - mod / i); } fact[0] = 1; invfact[0] = 1; for (int i = 1; i < 1212; i++) { fact[i] = fact[i - 1] * i; invfact[i] = invfact[i - 1] * inv[i]; } dp[1][1] = 1; for (int i = 2; i <= n; i++) { if (a[i - 2] < a[i - 1]) { dp[i][i] = 1; } else { break; } } for (int i = 0; i < n; i++) { for (int j = 1; j <= i; j++) { dp[i + 1][1] += dp[i][j] * P(j, 1); for (int k = 2; k <= j && i + k <= n; k++) { if (a[i + k - 2] < a[i + k - 1]) { dp[i + k][k] += dp[i][j] * P(j, k); } else break; } } } modint ans = 0; for (int i = 0; i < 1212; i++) { ans += dp[n][i]; } cout << ans.n << endl; }