#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include #define ll long long #define ullong unsigned long long int #define pb push_back #define mp make_pair #define endl "\n" #define forit(it, x) for (__typeof(x.begin()) it = x.begin(); it != x.end(); it++) #define f first #define s second #define all(x) x.begin(), x.end() #define prev qweqewqewqwe #define pii pair using namespace std; const int MAXN = 1e6 + 10; const int MOD = 1e9 + 7; const int INF = 1e9; const ll LINF = 1e18; int a[MAXN]; int fac[MAXN]; int rev[MAXN]; int n; int binpow(int x, int y) { int res = 1; while (y) { if (y & 1) { res = 1ll * x * res % MOD; } x = 1ll * x * x % MOD; y >>= 1; } return res; } int cnc(int x, int y) { return 1ll * fac[x] * rev[x - y] % MOD * rev[y] % MOD; } int anc(int x, int y) { return 1ll * fac[x] * rev[x - y] % MOD; } int dp[1250][1250]; int rec(int x, int lim) { if (x > n) { return 1; } if (dp[x][lim] != -1) { return dp[x][lim]; } int ans = 0; if (x == 1) { int mx = a[1]; for (int i = 1; i <= n; i++) { if (a[i] < mx) { break; } mx = max(mx, a[i]); int val = rec(i + 1, i); // cerr << "$ " << i << ": " << val << "\n"; ans += 1ll * val * cnc(i, i) % MOD; ans %= MOD; } } else { int mx = a[x]; for (int i = x, cnt = 1; i <= n && cnt <= lim; i++, cnt++) { if (a[i] < mx) { break; } mx = max(mx, a[i]); int val = rec(i + 1, cnt); // cerr << x << " " << lim << " | " << cnt << ": " << val << ' ' << anc(lim, cnt) <<'\n'; ans += 1ll * val * anc(lim, cnt) % MOD; ans %= MOD; } } //cerr << x << ' ' << lim << ": " << ans << '\n'; return dp[x][lim] = ans; } int main() { #ifdef DEBUG double beg = clock(); freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #else //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); #endif //ios_base::sync_with_stdio(0);cin.tie(0); scanf("%d", &n); fac[0] = rev[0] = 1; for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { dp[i][j] = -1; } } for (int i = 1; i <= n; i++) { fac[i] = (1ll * fac[i - 1] * i) % MOD; rev[i] = binpow(fac[i], MOD - 2); scanf("%d", &a[i]); } printf("%d", rec(1, 0)); #ifdef DEBUG double end = clock(); fprintf(stderr, "\n*** Total time = %.3lf ***\n", (end - beg) / CLOCKS_PER_SEC); #endif return 0; }