#include using namespace std; #define rep(i, from, to) for (int i = from; i < (to); ++i) #define trav(a, x) for (auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; const ll mod = 1000000007; int N; vi val; vector> mem; vector> bin; vector fact; ll solve(int at, int arsize) { if (at == N) return 1; ll& out = mem[at][arsize]; if (out != -1) return out; ll res = 0; rep(i,at+1,N+1) { if (i-1 > at && val[i-1] < val[i-2]) break; int len = i - at; if (len > arsize) break; if (at == 0 && i != arsize) continue; ll v = bin[arsize][i - at] * solve(i, i - at) % mod; if (at != 0) { v = v * fact[i - at] % mod; } res += v; } res %= mod; out = res; return res; } int main() { cin.sync_with_stdio(false); cin.exceptions(cin.failbit); cin >> N; mem.assign(N, vector(N+1, -1)); bin.assign(N+1, vector(N+1, 0)); fact.assign(N+1, 1); bin[0][0] = 1; rep(i,1,N+1) fact[i] = fact[i-1] * i % mod; rep(n,1,N+1) { rep(k,0,n+1) { bin[n][k] = ((k == 0 ? 0 : bin[n-1][k-1]) + bin[n-1][k]) % mod; } } val.resize(N); vi seen(N); rep(i,0,N) { cin >> val[i]; --val[i]; if (seen[val[i]]++) { assert(0); return 0; } } ll res = 0; rep(i,1,N+1) res += solve(0, i); res %= mod; cout << res << endl; }