unittest
{
	assert( [ "3 4", "2 2 4" ].parse.expand.solve == 5 );
	assert( [ "5 8", "9 9 9 9 9" ].parse.expand.solve == 0 );
	assert( [ "10 10", "3 1 4 1 5 9 2 6 5 3" ].parse.expand.solve == 152 );
}



import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto ns = input.front.split.to!( long[] );
	input.popFront;
	auto as = input.front.split.to!( long[] );
	return tuple( ns[ 1 ], as );
}

auto solve( long s, long[] as )
{
	const M = 998244353L;
	
	// dp[ i番目 ][ i番目までで選んだ整数の合計 ] = 通り数
	auto dp = new long[][]( 1 + as.length, 1 + s );
	
	// 選ぶ整数のうち一番左をi番目にした場合、Lは0～iのi+1通りになる
	foreach( i, ref dpp; dp )
	{
		dpp[ 0 ] = 1;
	}
	
	foreach( i, a; as )
	{
		foreach( j; 0L .. dp[ i ].length.signed - 1 )
		{
			// i番目の整数を選ばないとき
			dp[ i + 1 ][ j ] = ( dp[ i + 1 ][ j ] + dp[ i ][ j ] ) % M;
			
			// i番目の整数を選ぶとき
			auto ss = j + a;
			if( ss < dp[ i + 1 ].length ) dp[ i + 1 ][ ss ] = ( dp[ i + 1 ][ ss ] + dp[ i ][ j ] ) % M;
		}
	}
	
	// 選ぶ整数のうち一番右をi番目にした場合、Rはi～nのn-i通りになる
	auto ans = 0L;
	foreach( i, ref dpp; dp )
	{
		ans = ( ans + dpp[ $ - 1 ] * ( dp.length.signed - i ) ) % M;
	}
	return ans;
}
