// // // // Created by Evgeny Savinov on 09/01/2017. // #include #define clr(x) memset((x), 0, sizeof(x)) #define all(x) (x).begin(), (x).end() #define pb push_back #define mp make_pair #define x first #define y second #define forn(i, n) for(int i = 0; i < (int)(n); ++i) #define ford(i, n) for(int i = (int)(n) - 1; i >= 0; --i) #define for1(i, n) for(int i = 1; i <= (int)(n); ++i) using namespace std; typedef vector vi; typedef vector vvi; typedef pair pii; //typedef pair pii; typedef vector vll; typedef long double ld; typedef long long ll; typedef unsigned long long ull; typedef int itn; const ld PI = 3.1415926535897932384626433832795L; template bool uin(T &, const T &); template bool uax(T &, const T &); template T gcd(T, T); template T lcm(T, T); template inline string tostr(const _T &); template void input(T &); class range { using type = long long; public: class iterator { friend class range; public: using difference_type = range::type; using value_type = range::type; using pointer = const range::type *; using reference = const range::type &; using iterator_category = std::random_access_iterator_tag; value_type operator*() const { return i_; } const iterator &operator++() { ++i_; return *this; } iterator operator++(int) { iterator copy(*this); ++i_; return copy; } const iterator &operator--() { --i_; return *this; } iterator operator--(int) { iterator copy(*this); --i_; return copy; } difference_type operator-(const iterator &other) const { return i_ - other.i_; } iterator operator+(const difference_type &delta) const { return iterator(i_ + delta); } iterator &operator+=(const difference_type &delta) { i_ += delta; return *this; } iterator operator-(const difference_type &delta) const { return iterator(i_ - delta); } iterator &operator-=(const difference_type &delta) { i_ -= delta; return *this; } bool operator==(const iterator &other) const { return i_ == other.i_; } bool operator!=(const iterator &other) const { return i_ != other.i_; } protected: iterator(const value_type &start) : i_(start) {} private: value_type i_; }; iterator begin() const { return begin_; } iterator end() const { return end_; } range(const type &begin, const type &end) : begin_(begin), end_(end) {} range(const type &end) : begin_(0), end_(end) {} private: iterator begin_; iterator end_; }; template T nxt(); bool checkp(long long); template T pw(T a, T n, T p); template T inv(T a, T p); template _T sqr(const _T &x); class range; mt19937_64 gen; int TTT; ll mod = 1000000007; void pre() { } ll dp[1222][1222]; ll s[1222][1222]; void solve(int test) { int n = nxt(); vi a(n); forn(i, n) a[i] = nxt(); for (int i = 0; i <= n; ++i) { for (int j = 0; j <= n; ++j) { dp[i][j] = 0; } } for (int i = 1; i <= n; ++i) { ll mul = i; for (int j = 1; j <= i; ++j) { s[i][j] = mul; mul = mul * (i - j) % mod; } } for (int i = 1; i <= n; ++i) { dp[i][i] = 1; if (i < n && a[i] < a[i - 1]) break; } const ll many = 7 * mod * mod; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= i; ++j) { dp[i][j] %= mod; for (int k = 1; k <= j && i + k <= n; ++k) { dp[i + k][k] += dp[i][j] * s[j][k]; if (dp[i + k][k] >= many) dp[i + k][k] -= many; if (i + k < n && a[i + k] < a[i + k - 1]) break; } } } ll ans = 0; for (int i = 1; i <= n; ++i) { ans += dp[n][i]; ans %= mod; } ans %= mod; cout << ans << "\n"; } int main(int argc, char **argv) { #ifdef LOCAL freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); #else #define fname "sequence" //freopen(fname".in", "r", stdin); //freopen(fname".out", "w", stdout); #endif pre(); ::TTT = 1; #ifdef LOCAL #else #endif for (int test = 1; test <= ::TTT; ++test) { solve(test); } #ifdef LOCAL cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << " ms." << endl; #endif return 0; } template T gcd(T x, T y) { while (y > 0) { x %= y; swap(x, y); } return x; } template T lcm(T a, T b) { return a / gcd(a, b) * b; } template inline _T sqr(const _T &x) { return x * x; } template inline string tostr(const _T &a) { ostringstream os(""); os << a; return os.str(); } template inline void input(T &a) { static int ed; a = 0; while (!isdigit(ed = getchar()) && ed != '-') {} char neg = 0; if (ed == '-') { neg = 1; ed = getchar(); } while (isdigit(ed)) { a = 10 * a + ed - '0'; ed = getchar(); } if (neg) a = -a; } template inline T nxt() { T res; input(res); return res; } void myassert(bool v) { assert(v); //cout << "FAIL\n"; //exit(0); } mt19937 generator; bool checkp(long long v) { if (v < 2) return false; for (long long i = 2; i * i <= v; ++i) { if (v % i == 0) { return false; } } return true; } template T pw(T a, T n, T m) { T res = 1; while (n) { if (n & 1) { res = res * a % m; } a = a * a % m; n >>= 1; } return res; } template T inv(T a, T p) { T res = 1; while (a > 1) { res = res * (p - p / a) % p; a = p % a; } return res; } template bool uin(T &a, const T &b) { if (b < a) { a = b; return true; } return false; } template bool uax(T &a, const T &b) { if (b > a) { a = b; return true; } return false; }