#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
#define ll long long
//increase stack size
#pragma comment(linker, "/STACK:16777216")

ll mxm() {return LLONG_MIN;}
template<typename... Args>
ll mxm(ll a, Args... args) { return max(a,mxm(args...)); }

ll mnm() {return LLONG_MAX;}
template<typename... Args>
ll mnm(ll a, Args... args) { return min(a,mnm(args...)); }

template<class T> ostream& operator<<(ostream& os,vector<T> V){
	os<<"[ ";for(auto v:V)os<<v<<" ";return os<<"]";
}
template<class L,class R> ostream& operator<<(ostream& os,pair<L,R> P){
	return os<<"("<<P.first<<","<<P.second<<")";
}

#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__,__VA_ARGS__)
template<typename Arg1>
void __f(const char* name,Arg1&& arg1){
	cout<<name<<" : "<<arg1<<endl;
}
template <typename Arg1,typename... Args>
void __f(const char* names,Arg1&& arg1,Args&&... args){
	const char* comma=strchr(names+1,',');cout.write(names,comma-names)<<" : "<<arg1<<" | ";__f(comma+1,args...);
}
#else
#define trace(...) 1
#endif

#define ld long double
#define pll pair<ll,ll>
#define ii pair<int,int>
#define vll vector<ll>
#define vii vector<ii>
#define vi vector<int>
#define vpll vector<pll>
#define vld vector<ld>
#define vvld vector<vld>
#define vvi vector<vi>
#define vvll vector<vll>
#define vvpll vector<vpll>
#define vvii vector<vii>
#define I insert
#define F first
#define S second
#define pb push_back
#define endl "\n"
#define all(x)	x.begin(),x.end()

const int mod=998244353;
// 128 bit: __int128
inline int add(int a,int b){a+=b;if(a>=mod)a-=mod;return a;}
inline int sub(int a,int b){a-=b;if(a<0)a+=mod;return a;}
inline int mul(int a,int b){return (a*1ll*b)%mod;}
inline int power(int a,int b){int rt=1;while(b>0){if(b&1)rt=mul(rt,a);a=mul(a,a);b>>=1;}return rt;}
inline int inv(int a){return power(a,mod-2);}

struct compare{
	bool operator() (const int &a,const int &b) const{
		return a>b;
	}
};

const int N = 301;
int dp[N][N][N];

int main()
{
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout<<setprecision(25);
	string s;
	cin >> s;
	int K;
	cin >> K;
	vi cnt1;
	int tot = 0, n = s.size();
	K = min(n, K);
	int seen_0 = 0;
	for(int i = 0; i < n; i++){
		if(s[i] == '0'){
			if(!seen_0)
				tot = 0;
			seen_0 = 1;
			if(tot > 0)
				cnt1.pb(tot);
			if(tot == 0)
				cnt1.pb(0);
			tot = 0;
			continue;
		}
		tot++;
	}
	if(tot)
		cnt1.pb(tot);
	while(!cnt1.empty() && cnt1.back() == 0)
		cnt1.pop_back();

	if(cnt1.empty() || K == 0){
		cout << 1 << endl;
		return 0;
	}

	n = cnt1.size();
	int rem_balance = 0;
	for(int i = n - 1; i >= 0; i--){
		if(i == n - 1){
			for(int j = 0; j <= cnt1[i]; j++)
				for(int k = 0; k <= K; k++)
					if(k >= j)
						dp[i][j][k] = 1;
			rem_balance += cnt1[i];
			continue;
		}
		if(cnt1[i] == 0){
			for(int j = 0; j <= rem_balance; j++){
				for(int k = 0; k <= K; k++){
					if(k < j) continue;
					int take = min(rem_balance, K - k);
					for(int l = 0; l <= take; l++)
						dp[i][j][k] = add(dp[i][j][k], dp[i + 1][j + l][k + l]);
				}
			}
			continue;
		}
		for(int j = 0; j <= cnt1[i] + rem_balance; j++){
			for(int k = 0; k <= K; k++){
				if(k < j) continue;
				int take = min(rem_balance, K - k);
				for(int l = 0; l <= take; l++)
					dp[i][j][k] = add(dp[i][j][k], dp[i + 1][j + l][k + l]);
				int give = min(j, cnt1[i]);
				for(int l = 0; l <= give; l++)
					dp[i][j][k] = add(dp[i][j][k], dp[i + 1][j - l][k]);
				dp[i][j][k] = sub(dp[i][j][k], dp[i + 1][j][k]);
			}
		}
		rem_balance += cnt1[i];
	}
	int ans = 0;
	if(n <= 1)
		ans = 1;
	else
		ans = dp[0][0][0];
	cout << ans << endl;
}

Measured memory_bytes: 17716