#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e4+5;
constexpr int mod=1e6+7;
#define int long long
int dp[2][N];
int v[N];
int add(int a, int b){
    a+=b;
    if(a>=mod)a-=mod;
    return a;
}
int32_t main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)cin>>v[i];
    dp[0][0]=1;
    int mx=0,ok=0;
    for(int i=1;i<=n;++i){
        for(int j=2;j<=i;++j)
            dp[i&1][j]=(dp[i+1&1][j]*j+dp[i+1&1][j-1])%mod;
        if(v[i]!=1)ok=1;
        dp[i&1][0]=1;
        if(v[i]!=1)
            dp[i&1][mx]=add(dp[i&1][mx],(v[i]-1ll)*dp[i+1&1][0])%mod;
        if(ok)dp[i&1][1]=1;
        mx=max(mx,v[i]);
    }
    int ans=0;
    for(int i=1;i<=n;++i)
        ans+=dp[n&1][i];
    cout<<add(ans,1)<<'\n';
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |