#include<bits/stdc++.h>

using namespace std;
#define SZ(v) int((v).size())
#define ALL(vec) begin(vec), end(vec)
#define pb push_back
#define mk make_pair
#define fi first
#define se second
typedef long long ll;


template<typename T> inline bool uax(T &x, T y) {return (y > x) ? x = y, true : false;}
template<typename T> inline bool uin(T &x, T y) {return (y < x) ? x = y, true : false;}
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); \
  stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
string to_string(char c) { return "'" + string(1, c) + "'";}
string to_string(string s) { return '"' + s + '"';}
string to_string(const char* s) { return to_string((string) s);}
template<typename A> string to_string(A);
template<typename A, typename B> string to_string(pair<A, B> p){
  return "(" + to_string(p.first) + ": " + to_string(p.second) + ")";}
template<typename A> string to_string(A v) {bool f = false; string r = "{"; 
  for (auto x: v) {if (f) r += ", "; r += to_string(x); f = true;} return r += "}";}
template<typename A> string to_string(vector<vector<A>> v) {string r; 
  for (auto x: v) r += "\n" + to_string(x); return r;}
int Nerr;
template<typename A> string to_string(A *p) {return to_string(vector<A>(p, p + Nerr));}
void err(istream_iterator<string>) { cerr << endl; }
template<typename T,typename... Args> void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " =: " << to_string(a) << "; "; err(++it, args...); }
template<typename T> void kek(T ans) {cout << ans << endl; exit(0);}
int const MOD = 998244353;
long long const INF = 1e18 + 42;
int mod = 998244353;

int add(int a, int b){
  if(a + b >= mod)return a+ b - mod;
  return a + b;
}
int mul(ll a, ll b){
  return 1LL * a * b  % mod;
}
int sub(int a, int b){
  if(a >= b)return a - b;
  return a - b + mod;
}
int power(ll a, ll b){

  int re = 1;
  while(b){
    if(b&1){
      re = mul(re, a);
    }
    a = mul(a, a);
    b >>= 1;
  }
  return re;
}
int const N = 500000 + 5;
// int fact[N], inverse[N];
// void FAC(){
//   fact[0] = 1;
//   for(int x = 1; x< N; x++){
//     fact[x] = mul(fact[x-1], x);
//   }
//   inverse[N-1] = power(fact[N-1], mod -2);
//   for(int x = N-2; x>= 0; x--){
//     inverse[x] = mul(x + 1, inverse[x+1]);
//   }

//  }

// int ncr(int a, int b){
//   if(a < b)return 0;
//   return mul(fact[a], mul(inverse[a-b], inverse[b]));
// }

/***********************************************************************/
// int mod = MOD;
// int add(int a, int b){
//   if(a + b >= mod)return a + b - mod;
//   return a + b;
// }
// int mul(int a, int b){
//   return 1LL * a * b % mod;
// }
// vector<vector<int>> mull(vector<vector<int>> a, vector<vector<int>> b){
//   vector<vector<int>> re = {{0, 0}, {0, 0}};
//   for(int x =0; x<2; x++){
//     for(int y = 0;y<2; y++){
//       for(int z = 0; z<2; z++){
//         re[x][y] = add(re[x][y], mul(a[x][z], b[z][y]));
//       }
//     }
//   }
//   return re;

void solve(){
 int n, s;
 cin >> n >> s;
 vector<int> vec(s +  s + 10, 0), sum(s + s + 10, 0);
 // vec[0] = 1;
 int ans = 0;
 for(int x = 1; x<=n; x++){
  int i;
  cin >> i;
  if(i > s){
    ans = add(ans, vec[s]);
    continue;
  }
  vector<int> dp = vec;
  dp[i] = add(dp[i], x);
  for(int u = 0; u<= s + s - i; u++){
    dp[u+i] = add(dp[u+i], vec[u]);
  }
  // error(i ,dp, vec);
  // cout << "\n";
  swap(vec, dp);
  ans = add(vec[s], ans);

 }
 cout << ans
 ;

}


/**************/


int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  solve();
}


Measured memory_bytes: 384