/** * author: [itmo] enot.1.10 * created: 17.02.2017 20:28:48 **/ #define __USE_MINGW_ANSI_STDIO 0 #include #define F first #define S second #define pb push_back #define forn(i, n) for(int i = 0 ; (i) < (n) ; ++i) #define eprintf(...) fprintf(stderr, __VA_ARGS__),fflush(stderr) #define sz(a) ((int)(a).size()) #define all(a) (a).begin(),a.end() #define pw(x) (1LL<<(x)) using namespace std; typedef long long ll; typedef double dbl; typedef vector vi; typedef pair pi; const int inf = 1.01e9; const dbl eps = 1e-9; /* --- main part --- */ const int mod = 1e9 + 7; const int N = 1300; int a[N]; int d[N][N]; int cnk[N][N]; int fact[N]; int n; int go(int l, int r) { if (d[l][r] != -1) return d[l][r]; if (r == n) return 1; int &res = d[l][r]; res = 0; for (int z = r + 1; z <= n; ++z) { if (z >= r + 2 && a[z - 1] < a[z - 2]) break; if (z - r > r - l) break; res = (res + go(r, z) * (ll)cnk[r - l][z - r] % mod * (ll)fact[z - r]) % mod; } return res; } int main() { #ifdef home assert(freopen("1.in", "r", stdin)); assert(freopen("1.out", "w", stdout)); #endif forn(i, N) { cnk[i][0] = 1; for (int j = 1; j <= i; ++j) cnk[i][j] = (cnk[i - 1][j - 1] + cnk[i - 1][j]) % mod; } fact[0] = 1; for (int i = 1; i < N; ++i) fact[i] = fact[i - 1] * (ll)i % mod; scanf("%d", &n); forn(i, n) scanf("%d", &a[i]); int fst = n; for (int i = 0; i < n - 1; ++i) if (a[i] > a[i + 1]) { fst = i + 1; break; } memset(d, -1, sizeof d); int res = 0; for (int i = 1; i <= fst; ++i) res = (res + go(0, i)) % mod; printf("%d\n", res); #ifdef home eprintf("time = %d ms\n", (int)(clock() * 1000. / CLOCKS_PER_SEC)); #endif return 0; }