#include using namespace std; const int MOD = 1e9+7; int n, arr[1200]; long long cache[1200][1201]; long long comb[1201][1201]; long long fac[1201]; long long val(int a, int b) { return (comb[a][b] * fac[b]) % MOD; } long long f(int idx, int sz) { if(idx == n) return 1; long long& result = cache[idx][sz]; if(result != -1) return result; int pre = 0; result = 0; for(int i = idx; i < n; i++) { if((pre > arr[i]) || (i-idx+1 > sz)) break; result = (result + f(i+1, i-idx+1) * ((idx==0)?1:val(sz, i-idx+1))) % MOD; pre = arr[i]; } return result; } int main(void) { comb[0][0] = 1; fac[0] = 1; for(int i = 1; i <= 1200; i++) { comb[i][0] = comb[i][i] = 1; for(int j = 1; j < i; j++) comb[i][j] = (comb[i-1][j-1] + comb[i-1][j]) % MOD; fac[i] = (fac[i-1] * i) % MOD; } scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", arr+i); memset(cache, -1, sizeof(cache)); printf("%lld\n", f(0, n)); return 0; }