#include using namespace std; long long A[1200]; long long memo[1200][1200]; long long N; long long MOD = 1000000007; long long factmemo[1200]; long long memo3[1203]; long long fact(long long n) { if (factmemo[n] != 0) return factmemo[n]; if (n <= 1) return 1; return factmemo[n] = (n * fact(n-1)) % MOD; } long long modInverse(long long a2, long long m) { if (memo3[a2] != 0) return memo3[a2]; long long a = fact(a2); long long m0 = m, t, q; long long x0 = 0, x1 = 1; if (m == 1) return 0; while (a > 1) { // q is quotient q = a / m; t = m; // m is remainder now, process same as // Euclid's algo m = a % m, a = t; t = x0; x0 = x1 - q * x0; x1 = t; } // Make x1 positive if (x1 < 0) x1 += m0; return memo3[a2] = x1; } long long ways(long long n, long long v) { if (n == N) { return 1LL; } if (n > N) return 0; if (memo[n][v] != -1) return memo[n][v]; long long ans = 0; for (long long i = n; i < N; i++) { if (i != n && A[i] < A[i-1]) break; if (i-n+1 > v) break; ans += (((fact(v)*modInverse(v-(i-n+1), MOD))%MOD) * ways(i+1, i-n+1))%MOD; ans %= MOD; } // cout << n << " " << v << " "<< ans << endl; return memo[n][v] = ans%MOD; } /* ways(2, 2) = ways(3, 1) + ways() */ int main() { ios::sync_with_stdio(false); cin.tie(0); memset(memo,-1,sizeof memo); long long n; cin >> n; N = n; for (long long i = 0; i < n; i++) { cin >> A[i]; } // how many ways can we fill (k, k+1, ..., n) using v arrays? /* put the first v elements in each array 1 2 3: v=1: {[1]} */ long long ans = ways(1, 1); for (long long i = 1; i < n; i++) { if (A[i] < A[i-1]) break; // cout << ways(i+1,i+1) << endl; ans += ways(i+1, i+1); } cout << ans%MOD << endl; }