#include #include #include #include #include #include #include #include #include #include #include #define pb push_back #define ll long long #define mp make_pair #define f first #define s second #define pii pair < int, int > #define ull unsigned long long #define pll pair < ll, ll > #define forit(it, s) for(__typeof(s.begin()) it = s.begin(); it != s.end(); it ++) #define all(s) s.begin(), s.end() #define sz(a) (int)a.size() const int inf = (1ll << 30) - 1; const int maxn = (int) 1e5 + 10; using namespace std; int n; int a[100100]; const int mod = 1000 * 1000 * 1000 + 7; int dp[2002][2002]; int sum[2002][2002]; int C[2002][2002]; int get(int pos, int len){ if(pos==n) return 1; int &res = dp[pos][len]; if(res != -1) return res; res = get(pos + 1, 1) * 1ll * C[len][1] % mod; for(int i = 1; i < len; i++){ if(i + pos == n) break; if(a[i+pos] < a[i + pos-1]) break; res+=get(pos+i + 1, i + 1) * 1ll * C[len][i + 1] % mod; if(res >=mod) res-=mod; } return res; } int fact[2002]; int rev[2002]; int revf[2002]; void solve(){ scanf("%d", &n); for(int i =0; i < n; i++){ scanf("%d", &a[i]); } memset(dp, -1, sizeof dp); fact[0] = 1; rev[0]= 1; revf[0] = 1; for(int i = 1; i <= n; i++){ fact[i] =fact[i-1] * 1ll * i % mod; if(i > 1) rev[i] = (mod - (mod/i) * 1ll * rev[mod%i] % mod) % mod; else rev[i] = 1; revf[i] = (revf[i-1] * 1ll * rev[i]) % mod; } for(int i = 1; i <= n; i++){ for(int j = 0; j<= i;j++) C[i][j] = fact[i] * 1ll * revf[i-j] % mod; } int ans = get(1, 1); for(int i = 1; i = a[i-1]){ ans=(ans+ get(i+1, i+1)) % mod; }else break; } printf("%d\n", ans); } int main () { #ifdef LOCAL freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); #endif int t=1; //scanf("%d", &t); for(int i=1; i <= t; i++){ //printf("Case #%d\n", i); solve(); } return 0; }