#include #define __INIT_CC__ ios::sync_with_stdio(false); \ cin.tie(0); #ifdef __WIN32__ char getchar_unlocked() {return getchar();} #endif #define FOR(_i,_n,_m) for(int (_i)=(_n),_t=(_m);_i<(_t);++(_i)) #define FORN(_i,_n,_m) for(int (_i)=(_n),_t=(_m);_i<=(_t);++(_i)) #define FORD(_i,_n,_m) for(int (_i)=(_n),_t=(_m);_i>=(_t);--(_i)) #define FORLL(_i,_n,_m) for(long long (_i)=(_n),_t=(_m);_i<(_t);++(_i)) #define FORNLL(_i,_n,_m) for(long long (_i)=(_n),_t=(_m);(_i)<=(_t);++(_i)) #define FORDLL(_i,_n,_m) for(long long (_i)=(_n),_t=(_m);(_i)>=(_t);--(_i)) #define FOREACH(_i,_a) for (__typeof(_a.begin()) _i=_a.begin();_i!=_a.end();++_i) #define RESET(_a,_value) memset(_a,_value,sizeof(_a)) #define pb push_back #define ppb pop_back #define pf push_front #define ppf pop_front #define ff first #define ss second #define mp make_pair #define SIZE(_a) (int)_a.size() #define VSORT(_a) sort(_a.begin(),_a.end()) #define SSORT(_a,_val) sort(_a,_a+(_val)) #define ALL(_a) _a.begin(),_a.end() #define mt make_tuple #define _get(_tuple,_i) get<_i>(_tuple) #define eb emplace_back using namespace std; const int dr[] = { 1, 0,-1, 0, 1, 1,-1,-1}; const int dc[] = { 0, 1, 0,-1, 1,-1,-1, 1}; const double eps = 1e-9; typedef vector vi; typedef pair ii; typedef vector vii; typedef long long ll; typedef unsigned long long ull; typedef pair pll; typedef vector vpll; typedef vector vll; typedef pair pdd; typedef vector vpdd; const int INF = 0x7FFFFFFF; const ll INFLL = 0x7FFFFFFFFFFFFFFFLL; const double pi = acos(-1); template T take(queue &O) {T tmp=O.front();O.pop();return tmp;} template T take(stack &O) {T tmp=O.top();O.pop();return tmp;} template T take(priority_queue &O) {T tmp=O.top();O.pop();return tmp;} template inline void getint(T &num) { bool neg = 0; num = 0; char c; while ((c = getchar_unlocked()) && (!isdigit(c) && c != '-')); if (c == '-') { neg = 1; c = getchar_unlocked(); } do num = num * 10 + c - '0'; while ((c = getchar_unlocked()) && isdigit(c)); if (neg) num = -num; } template inline bool inRange(T z, T a, T b){return a <= z && z <= b;} void OPEN(string in = "input.txt",string out = "output.txt") { freopen(in.c_str(), "r", stdin); freopen(out.c_str(), "w", stdout); return ; } //using sokokaleb's template v3.1 #define N 1205 const int MOD = 1000000007; int dp[N][N]; int n, arr[N]; int f(int pos, int bef) { int& res = dp[pos][bef]; if (res != -1) return res; if (pos == n) return res = 1; int pengali = 1; res = 0; FORN (i, 1, bef) { if (i > 1 && arr[pos + i - 1] <= arr[pos + i - 2]) break ; pengali = (1LL * pengali * (bef - i + 1)) % MOD; res += (1LL * pengali * f(pos + i, i)) % MOD; if (res >= MOD) res -= MOD; } return res; } int main(int argc, char** argv) { __INIT_CC__ cin >> n; FOR (i, 0, n) { cin >> arr[i]; } RESET(dp, -1); int ans = 0; bool valid = 1; FORN (i, 1, n) { if (i > 1) valid &= (arr[i - 1] > arr[i - 2]); if (!valid) break ; ans += f(i, i); if (ans >= MOD) ans -= MOD; } cout << ans << "\n"; }