/* ye mera template hai apna khud likho bc :P */ /* Author : Sarvagya Agarwal */ #include using namespace std; //defines #define openin freopen("input.txt","r",stdin) #define openout freopen("output.txt","w",stdout) #define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define ll long long #define int long long #define mod 1000000007 #define repr(i,x,y) for (__typeof(x) i=x;i>=y;i--) #define rep(i,x,y) for (__typeof(x) i=x;i<=y;i++) #define all(c) (c).begin(),(c).end() #define ff first #define ss second #define pb push_back #define mp make_pair /* Print pair */ template ostream & operator << (ostream &os , const pair &v) { os << "(" ; os << v.first << "," << v.second << ")" ; return os ; } /* Print vector */ template ostream & operator << (ostream &os , const vector &v) { os << "[" ; int sz = v.size() ; for(int i = 0 ; i < sz ; ++i) { os << v[i] ; if(i!=sz-1)os << "," ; } os << "]\n" ; return os ; } /* Print set */ template ostream & operator << (ostream &os , const set &v) { T last = *v.rbegin() ; os << "[" ; for(auto it : v) { os << it ; if(it != last) os << "," ; } os << "]\n" ; return os ; } /* Print Map */ template ostream & operator << (ostream &os , const map &v) { for(auto it : v) { os << it.first << " : " << it.second << "\n" ; } return os ; } int power(int a , int b) { int res = 1 ; while(b) { if(b%2) { res = (res * a) % mod ; } b/=2 ; a = (a*a) % mod ; } return res ; } //debug #define TRACE #ifdef TRACE #define trace(...) __f(#__VA_ARGS__, __VA_ARGS__) template void __f(const char* name, Arg1&& arg1){ cerr << name << " : " << arg1 << std::endl; } template void __f(const char* names, Arg1&& arg1, Args&&... args){ const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...); } #else #define trace(...) #endif const int maxn = 1222 ; int n , k , arr[maxn] , dp[maxn][maxn] ; int NCR[maxn][maxn] , fact[maxn] ; bool is_increasing[maxn][maxn] ; int solve(int index , int sets) { if(index > n) { return 1 ; } int &res = dp[index][sets] ; if(res != -1) return res ; res = 0 ; for(int k = 1 ; k <= sets ; ++k) { if(index + k - 1 > n) break ; if(is_increasing[index][index+k-1]) { res += (((solve(index+k , k ) % mod) * NCR[sets][k]) % mod * fact[k]) % mod ; } } return res % mod ; } int32_t main() { fast; for(int i = 0 ; i < maxn ; ++i) NCR[i][0] = 1 ; fact[0] = 1 ; for(int i = 1 ; i < maxn ; ++i) { fact[i] = fact[i-1] * i ; fact[i] %= mod ; for(int j = 1 ; j <= i ; ++j) { NCR[i][j] = NCR[i-1][j] + NCR[i-1][j-1] ; NCR[i][j] %= mod ; } } cin >> n ; for(int i = 1 ; i <= n ; ++i) cin >> arr[i] ; for(int i = 1 ; i <= n ; ++i) { int j = i + 1 ; is_increasing[i][i] = true ; while(j <= n && arr[j] >= arr[j-1]) { is_increasing[i][j] = true ; j++ ; } } memset(dp,-1,sizeof(dp)) ; int fans = 0 ; for(int i = 1 ; i <= n ; ++i) { if(is_increasing[1][i]) { fans += solve(i + 1 , i) ; fans %= mod ; } } cout << fans << "\n" ; return 0; }