#include using namespace std ; //USUAL #define s(n) scanf("%d",&n) #define sl(n) scanf("%lld",&n) #define sc(n) scanf("%c",&n) #define forall(i,a,b) for(int i=a;i #define F first #define S second #define ic pair #define li pair < long long int , int > #define mp make_pair #define vi vector #define vvi vector< vi > #define vl vector #define vvl vector< vl > #define vii vector< ii > #define vvii vector< vii > #define pb push_back //#define tr(it,c) for( typeof ( (c).begin() ) it = c.begin();it!=(c).end();++it) //Constants #define pi 3.141592653 #define e 2.7182818284 #define MAXP 1000000 #define MAXN 1205 #define MOD 1000000007 //Global Variables int n , m[MAXN] ; ll dp[MAXN][MAXN] , choose[MAXN][MAXN] , fact[MAXN] ; ll f(int max_size , int index){ if(index==n) return 1 ; if(dp[max_size][index] != -1) return dp[max_size][index] ; dp[max_size][index] = 0 ; for(int i=index ; i m[i-1])){ ll product = choose[max_size][i-index+1] * fact[i-index+1] ; product %= MOD ; dp[max_size][index] += f(i-index+1 , i+1) * product ; dp[max_size][index] %= MOD ; } else break ; } } return dp[max_size][index] ; } int main() { s(n) ; forall(i,0,n)s(m[i]) ; memset(dp,-1,sizeof(dp)) ; memset(choose,0,sizeof(choose)) ; choose[0][0] = 1 ; forall(i,1,n+1){ forall(j,0,i+1){ if(j==0){choose[i][j] = 1 ; continue ; } choose[i][j] = choose[i-1][j-1] + choose[i-1][j] ; if(choose[i][j] > MOD) choose[i][j] -= MOD ; } } fact[0] = 1 ; forall(i,1,n+1){ fact[i] = i*fact[i-1] ; fact[i] %= MOD ; } ll ans = 0 ; forall(i,0,n){ if(i==0){ans += f(i-0+1,i+1) ; /*cout< m[i-1]){ ans += f(i-0+1 , i+1) ; if(ans > MOD) ans -= MOD ; /*cout<