#include using namespace std; using mint = atcoder::modint998244353; template struct SparseTable { vector> table; vector lookup; int LOGV=0, _n; SparseTable(const vector &v) { _n=v.size(); while(_n>>LOGV)LOGV++; table.assign(LOGV,vector(_n)); lookup.resize(_n+1); for(int i = 0; i < _n; i++) table[0][i] = v[i]; for(int i = 1; i < LOGV; i++) { for(int j = 0; j + (1 << i) <= _n; j++) { table[i][j] = op(table[i - 1][j], table[i - 1][j + (1 << (i - 1))]); } } lookup[1]=0; for(int i = 2; i < lookup.size(); i++) { lookup[i] = lookup[i >> 1] + 1; } } inline T prod(const int l, const int r){ assert(0 <= l && l < r && r <= _n); int b = lookup[r - l]; return op(table[b][l],table[b][r - (1<> n; vector a(n); for(auto &&v:a) cin >> v; SparseTable st(a); vector dp(n + 1); dp[0] = 1; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(st.prod(min(i, j), max(i, j) + 1) == a[i]){ dp[j + 1] += dp[j]; } } } cout << dp[n].val() << endl; }