#include using namespace std; #define int long long #define all(a) (a).begin(), (a).end() #define ms(a,v) memset(a, v, sizeof(a)) #define sz(v) ((int)(v).size()) #define mp make_pair #define pb push_back #define prev biiiiirl_sai_de_casa_comi_pra_caralho #define next trapezio_descendente #define index eh_ele_que_nos_vai_buscar #define left aqui_eh_37_anos_porra #define R32 ({int32_t x; scanf("%d", &x); x;}) #define RL ({long long x; scanf("%lld", &x); x;}) #define RC ({char x; scanf(" %c", &x); x;}) #define RI RL #define ff first #define ss second typedef pair ii; typedef vector vi; typedef vector vvi; typedef vector vii; typedef long long ll; const int N = 1210; const int MOD = (int)1e9+7; int a[N]; int dp[N][N]; int bad_memo[N][N]; int n; int C[N][N]; int fat[N]; int F(int x){ if(x == 0) return 1; if(fat[x] != -1) return fat[x]; return fat[x] = F(x-1)*x%MOD; } int nCr(int n, int r){ if(r > n) return 0; if(r == 0 || r == n) return 1; if(C[n][r] != -1) return C[n][r]; return C[n][r] = (nCr(n-1, r) + nCr(n-1, r-1))%MOD; } bool bad(int i, int mx){ if(mx == 1) return false; if(bad_memo[i][mx] != -1) return bad_memo[i][mx]; return bad_memo[i][mx] = !(a[i+mx-1] > a[i+mx-2] && !bad(i, mx-1)); } int go(int i, int mx){ if(i+mx > n) return 0; if(bad(i, mx)) return 0; if(i+mx == n) return 1; if(dp[i][mx] != -1) return dp[i][mx]; int & res = dp[i][mx]; res = 0; for(int j = 1; j <= mx; j++){ res += go(i+mx, j)*nCr(mx, j)%MOD*F(j)%MOD; res %= MOD; } return res; } int32_t main(){ memset(dp, -1, sizeof dp); memset(C, -1, sizeof C); memset(fat, -1, sizeof fat); memset(bad_memo, -1, sizeof bad_memo); n = RI; for(int i = 0; i < n; i++) a[i] = RI; int ans = 0; for(int i = 1; i <= n; i++){ ans += go(0, i); ans %= MOD; } cout << ans << endl; }