#include using namespace std; typedef long long int lli; lli M = 1000000007; int n; int m[1201] = { 0 }; int cnt[1201][1201] = {{ 0 }}; int cmb[1201][1201] = {{ 0 }}; bool inc[1201][1201] = {{ false }}; lli countComb(int maxPiles, int piles, int start){ if (start == 0) return 1; if (cmb[maxPiles][piles] > 0) return cmb[maxPiles][piles] - 1; lli out = 1, x = maxPiles; for (int i = 0; i < piles; i++){ out = (out * x) % M; x--; } cmb[maxPiles][piles] = out + 1; return out; } lli countWays(int start, int maxPiles){ if (maxPiles == 1) return 1; if (start == n) return 1; if (cnt[start][maxPiles] > 0) return cnt[start][maxPiles] - 1; lli out = 0; for (int np = 1; np <= maxPiles; np++){ if (start + np > n) break; if (!inc[start][start + np - 1]) break; lli newcnt = countWays(start + np, np); newcnt = (newcnt * countComb(maxPiles, np, start)) % M; out = (out + newcnt) % M; } cnt[start][maxPiles] = out + 1; return out; } int main(){ cin >> n; for(int i = 0; i < n; i++){ cin >> m[i]; } for (int i = 0; i < n; i++) inc[i][i] = true; for (int i = 0; i < n; i++){ for (int j = 0; j < i; j++){ inc[j][i] = inc[j][i-1] && (m[i] > m[i-1]); } } lli out = 0; for (int np = 1; np <= n; np++){ out = (out + countWays(np, np)) % M; if (!inc[0][np]) break; } cout << countWays(0, n) << endl; /* for (int i = 0; i < 3; i++){ for (int j = 1; j <= 3; j++){ cout << cnt[i][j] << " "; } cout << endl; } */ return 0; }