#include using namespace std; int n; long long int mod=1000000007; long long int results[1200][1200]; long long int frac[1201]; long long int fracInv[1201]; long long int modInverse(long long int a, long long int p) { //calculates a^x mod p in logarithmic time. long res = 1; long long int x=p-2; while(x > 0) { if( x % 2 != 0) { res = (res * a) % p; } a = (a * a) % p; x /= 2; } return res; } vector m; deque nextInv; void solve(int pos){ results[pos][0]=1; int x=(nextInv[pos]-pos); for(int i=2;i<=x;i++){ if(pos+i==n) results[pos][i-1]=1; else{ long long int tot=0; int t=min(i,nextInv[pos+i]-(pos+i)); for(int j=1;j<=t;j++){ tot+=results[pos+i][j-1]*fracInv[i-j]; tot%=mod; } tot*=frac[i]; tot%=mod; results[pos][i-1]=tot; } } } int main(){ cin >> n; //vector m(n); frac[0]=1; frac[1]=1; fracInv[0]=1; fracInv[1]=1; for(long long int i=2;i<=1200;i++){ frac[i]=frac[i-1]*i; frac[i]%=mod; fracInv[i]=modInverse(frac[i],mod); } for(int m_i = 0; m_i < n; m_i++){ int input; cin >> input; m.push_back(input); } // your code goes here int nn=n; for(int i=n-1;i>0;i--){ nextInv.push_front(nn); if(m[i-1]>m[i])nn=i; } nextInv.push_front(nn); for(int i=n-1;i>=0;i--) solve(i); long long int ans=0; for(int i=0;i