Problem:
Score : 600 points

Problem Statement

Given are a sequence of N integers A_1, A_2, \ldots, A_N and a positive integer S.

For a pair of integers (L, R) such that 1\leq L \leq R \leq N, let us define f(L, R) as follows:

f(L, R) is the number of sequences of integers (x_1, x_2, \ldots , x_k) such that L \leq x_1 < x_2 < \cdots < x_k \leq R and A_{x_1}+A_{x_2}+\cdots +A_{x_k} = S.

Find the sum of f(L, R) over all pairs of integers (L, R) such that 1\leq L \leq R\leq N. Since this sum can be enormous, print it modulo 998244353.

Constraints

All values in input are integers.

1 \leq N \leq 3000

1 \leq S \leq 3000

1 \leq A_i \leq 3000

Input

Input is given from Standard Input in the following format:

N S
A_1 A_2 ... A_N

Output

Print the sum of f(L, R), modulo 998244353.

Sample Input 1

3 4
2 2 4

Sample Output 1

5

The value of f(L, R) for each pair is as follows, for a total of 5.

f(1,1) = 0

f(1,2) = 1 (for the sequence (1, 2))

f(1,3) = 2 (for (1, 2) and (3))

f(2,2) = 0

f(2,3) = 1 (for (3))

f(3,3) = 1 (for (3))

Sample Input 2

5 8
9 9 9 9 9

Sample Output 2

0

Sample Input 3

10 10
3 1 4 1 5 9 2 6 5 3

Sample Output 3

152

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
typedef long long ll;
typedef long double ld;
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define mod 998244353
#define inf 1000000000000000
#define bpc(x) __builtin_popcountll(x)
#define autoit(x,it) for(auto it = x.begin(); it != x.end(); it++)
#define rep(n) for(ll i = 0; i < n; i++)
#define repi(i,n) for(ll i = 0; i < n; i++)

#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 

#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update> 

using namespace std;

bool ispa(string s)
{
    ll n = s.length();
    bool pos = 1;
    rep(n)
        if(s[i]!=s[n-1-i])
            pos = 0;
    return pos;        
}

int main()
{
   FAST/**/
   
   ll n,s;
   cin>>n>>s;
   ll arr[n];
   rep(n)
        cin>>arr[i];
   
   ll dp[n][s];
   memset(dp,0,sizeof(dp));
   if(arr[0]<s)
     dp[0][arr[0]] = 1;
   ll ans = 0;
   if(arr[0] == s)
        ans+=n, ans%=mod;        
   for(ll i=1;i<n;i++)
   {
       ll rways = n-i;
       if(s-arr[i]>0){
           ans+=((rways*dp[i-1][s-arr[i]])%mod), ans%=mod;
       }
       if(arr[i] == s)
       {
           ans+=(((i+1)*rways)%mod), ans%=mod;
       }
       for(ll prev = 1;prev<s;prev++)
           dp[i][prev] = dp[i-1][prev];
       if(arr[i]<s){
       dp[i][arr[i]] += (i+1);
       dp[i][arr[i]]%=mod;
       }
       
       for(ll prev = 1;prev<s-arr[i];prev++)
       {
           dp[i][prev+arr[i]]+=dp[i-1][prev];
           dp[i][prev+arr[i]]%=mod;
       }
               
   }
   ans%=mod;
   if(ans<0)
        ans+=mod;
   cout<<ans;
   return 0;        
}