#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const int MOD = 1000000007; // DID YOU FIX GLOBAL STATE int n; int l[1205]; ll dp[1205][1205]; ll solve(int sufLen, int currLen) { if(currLen == 1) return 1; if(dp[sufLen][currLen] >= 0) { return dp[sufLen][currLen]; } dp[sufLen][currLen] = 0; int startIndex = n - sufLen; int currIndex = startIndex; for(int a = 1; a < currLen; a++) { if(l[currIndex] > l[currIndex+1]) { return 0; } currIndex++; } if(sufLen == currLen) { dp[sufLen][currLen] = 1; return 1; } ll scale = 1; for(int a = 1; a <= currLen && a <= sufLen - currLen; a++) { scale *= (currLen-a+1); scale %= MOD; dp[sufLen][currLen] += scale * solve(sufLen-currLen, a); dp[sufLen][currLen] %= MOD; } return dp[sufLen][currLen]; } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &l[i]); } for(int a = 0; a <= n; a++) { for(int b = 1; b <= n; b++) { dp[a][b] = -1; } } ll ret = 0; for(int i = 1; i <= n; i++) { ret += solve(n, i); ret %= MOD; } printf("%lld\n", ret); return 0; }