#include "bits/stdc++.h" using namespace std; typedef long long ll; typedef vector vi; typedef pair ii; #define fill(a,x) memset(a,x,sizeof(a)) #define pb push_back #define sz(x) (int)x.size() #define all(x) x.begin(),x.end() #define F first #define S second #define FOR(i,a,b) for(int i = a; i<=b; ++i) #define NFOR(i,a,b) for(int i = a; i>=b; --i) #define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0) const ll INF = 1e18; const int mod = 1e9+7; const int N = 1500; inline int add(int x,int y){ x += y; if(x >= mod) x -= mod; return x; } inline int mul(int x,int y){ x = (1LL * x * y) % mod; return x; } int dp[N][N],a[N]; int so[N][N]; int fact[N],inv[N]; int DP(int n,int k){ if(n == 0)return 1; if(so[n-k+1][n] == 0)return 0; if(n == k)return 1; int &ret = dp[n][k]; if(~ret)return ret; ret = 0; FOR(i,k,n-k){ int x = DP(n-k,i); x = mul(x,fact[i]); x = mul(x,inv[i-k]); ret = add(ret,x); } return ret; } ll expo(ll a,ll b,ll c = mod){ if(!b)return 1; ll temp = expo(a,b/2,c); temp = temp*temp%c; if(b&1)temp = temp*a%c; return temp; } int main(){ fast; fact[0] = inv[0] = 1; FOR(i,1,N-1){ fact[i] = mul(i,fact[i-1]); inv[i] = expo(fact[i],mod-2); } fill(dp,-1); int n; cin >> n; FOR(i,1,n)cin >> a[i]; FOR(i,1,n){ assert(a[i] >= 1 && a[i] <= n); } fill(so,0); FOR(i,1,n){ FOR(j,i,n){ if(i == j)so[i][j] = 1; else if(a[j] > a[j-1])so[i][j] = so[i][j-1]; else so[i][j] = 0; } } // FOR(i,1,n){ // FOR(j,i,n){ // cout << i << " " << j << " " << so[i][j] << "\n"; // } // } int ans = 0; FOR(i,1,n){ //cout << DP(n,i) << "\n"; ans = add(ans,DP(n,i)); } //cout << DP(1,1) << "\n"; cout << ans << "\n"; return 0; }