#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:64000000") typedef long long ll; using namespace std; const int MAXK = -1; const int MAXN = 1222; const int MOD = 1000 * 1000 * 1000 + 7; int dp[MAXN][MAXN]; int fct[MAXN], ofct[MAXN]; int solve(vector a) { int n = a.size(); memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) { if (i > 1 && a[i - 1] < a[i - 2]) break; dp[i][i] = 1; } for (int i = 1; i < n; i++) { //cerr << i << endl; for (int j = 1; j <= i; j++) { if (dp[i][j] == 0) continue; for (int k = 1; k <= j && i + k <= n; k++) { if (k > 1 && a[i + k - 1] < a[i + k - 2]) break; dp[i + k][k] = (dp[i + k][k] + dp[i][j] * 1LL * fct[j] % MOD * ofct[j - k]) % MOD; } } } int ans = 0; for (int i = 0; i <= n; i++) ans = (ans + dp[n][i]) % MOD; return ans; } int bin(int a, int n) { int res = 1; while (n) { if (n & 1) res = 1LL * res * a % MOD; a = 1LL * a * a % MOD; n >>= 1; } return res; } int inv(int x) { return bin(x, MOD - 2); } void precalc() { fct[0] = 1; for (int i = 1; i < MAXN; i++) { fct[i] = 1LL * fct[i - 1] * i % MOD; } ofct[MAXN - 1] = inv(fct[MAXN - 1]); for (int i = MAXN - 2; i >= 0; i--) ofct[i] = 1LL * ofct[i + 1] * (i + 1) % MOD; } int main() { #ifdef _MSC_VER freopen("input.txt", "r", stdin); #endif precalc(); int n; while (cin >> n) { vector a(n); for (int i = 0; i < n; i++) cin >> a[i]; /*n = 1200; a.resize(n); for (int i = 0; i < n; i++) a[i] = i + 1;*/ cout << solve(a) << endl; } return 0; }