#include using namespace std; typedef long long int64; const int mod = 1e9 + 7; inline int64 modPow(int64 x, int64 n) { if(n == 0) return (1); int64 ret = modPow(x, n / 2); (ret *= ret) %= mod; if(n & 1) (ret *= x) %= mod; return (ret); } inline int64 modInv(int64 a) { return (modPow(a, mod - 2)); } int N, M[1202]; bool sorted[1202][1202]; int dp[1201][1201]; int64 fact[1300], rfact[1300]; int rec(int idx, int sz) { if(idx == N) return (1); if(~dp[idx][sz]) return (dp[idx][sz]); int64 ret = 0; for(int j = idx; j < N; j++) { const int nsz = j - idx + 1; if(nsz > sz) break; if(sorted[idx][j]) { int64 qual = fact[sz] * rfact[sz - nsz] % mod; ret += qual * rec(j + 1, nsz) % mod; ret %= mod; } } return (dp[idx][sz] = ret); } int main() { fact[0] = rfact[0] = 1; for(int i = 1; i < 1300; i++) { fact[i] = fact[i - 1] * i % mod; rfact[i] = modInv(fact[i]); } cin >> N; for(int i = 0; i < N; i++) { cin >> M[i]; } for(int i = 0; i < N; i++) { sorted[i][i] = true; for(int j = i + 1; j < N; j++) { if(M[j - 1] > M[j]) break; sorted[i][j] = true; } } memset(dp, -1, sizeof(dp)); int ret = 0; for(int i = 0; i < N; i++) { if(sorted[0][i]) { ret += rec(i + 1, i + 1); ret %= mod; } } cout << ret << endl; }