#include using namespace std; #define FOR(i,n) for(lli i=0;i<(lli)(n);++i) #define FORU(i,j,k) for(int i=(j);i<(k);++i) #define FORD(i,j,k) for(int i=(j);i>=(k);--i) #define pb push_back #define mp make_pair #define mt make_tuple //Useful types using vi = vector; using vvi = vector; using lli = long long int; using vl = vector; using vvl = vector; using ii = pair; using vii = vector; using vvii = vector; using ll = pair; using vll = vector; using vvll = vector; using iii = tuple; using viii = vector; using lll = tuple; using vlll = vector; //Types for I/O string iotype(lli const&) {return "%lld";} string iotype(int const&) {return "%d";} string iotype(char const&) {return "%c";} string iotype(double const&) {return "%6f";} string iotype(size_t const&) {return "%zu";} string iotype(char* const &) {return "%s";} //Read template void read_values(T &v) { scanf(iotype(v).c_str(), &v); } void read_values(string &s) { cin >> s; } void RD() {} template void RD(T &v, Tail... t) { read_values(v); RD(t...); } //Print template void print_value(T const &v) { printf(iotype(v).c_str(),v);} void print_value(string const& v) { printf("%s", v.c_str());} void PR() {} template void PR(T const &v, Tail... t) {print_value(v); printf(" "); PR(t...);} template void PRNL(T const &v) {print_value(v); printf("\n");} template void PRNL(T const &v, Tail... t) {print_value(v); printf(" "); PRNL(t...);} lli dyn[1242][1242]; lli fact[1242][1242]; lli P = 1000*1000*1000 + 7; vi v; lli calc(int pos, int group) { if(dyn[pos][group] != -1) { return dyn[pos][group]; } int last = -1; lli sum = 0; FOR(i,group+1) { if(pos+i >= (int)v.size() || v[pos+i] < last) { break; } last = v[pos+i]; lli next = calc(pos+i+1,i); next *= fact[group-i+1][group+1]; next = next % P; sum += next; sum = sum%P; } dyn[pos][group] = sum; return sum; } int main() { int n; RD(n); v = vi(n); RD(v[0]); FORU(i,1,n) { RD(v[i]); } FOR(i,1242) { FOR(j,1242) { dyn[i][j] = -1; } } FOR(i,1242) { dyn[v.size()][i] = 1; } FOR(i,1242) { fact[i][i] = max(1,(int)i); FORU(j,i+1,1242) { fact[i][j] = (fact[i][j-1]*j)%P; } } lli sum = 0; int last = -1; FOR(i,v.size()) { if(v[i] < last) { break; } last = v[i]; sum += calc(i+1,i); sum = sum%P; } PRNL(sum); return 0; }