#include <iostream>
#include <algorithm>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <map>
#include <queue>
#include <set>

using namespace std;
#include <bits/stdc++.h>
#include <chrono>
#include <time.h>
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define rand(l,r) uniform_int_distribution<int>(l,r)(rng)

struct StringHash
{
	template <typename T>
	inline bool checkPrime(T x)
	{
		for(T i=2;i*i<=x;i++)
		{
			if(x%i==0) return false;
		}
		return true;
	}
	inline int nextPrime(int x)
	{
		for(int i=x;;i++)
		{
			if(checkPrime(i)) return i;
		}
	}
	int *hh;
	int n;
	int prime;
	int mod;
	int *e;
	inline void init(int _n,int _prime=-1,int _mod=-1)
	{
		n=_n;
		if(_prime==-1) prime=nextPrime(rand(1e8,3e8));else prime=_prime;
		if(_mod==-1) mod=nextPrime(rand(8e8,1e9));else mod=_mod;
		hh=new int[n+5];
		e=new int[n+5];
		e[0]=1;
		for(int i=1;i<n;i++)
		{
			e[i]=1LL*e[i-1]*prime%mod;
		}
	}
	inline void feedString(char c[])
	{
		n=strlen(c);
		hh[0]=c[0];
		for(int i=1;i<n;i++)
		{
			hh[i]=(1LL*hh[i-1]*prime+c[i])%mod;
		}
	}
	inline int getHash(int pos,int len)
	{
		assert(pos+len<=n);
		return (hh[pos+len-1]-1LL*(pos?hh[pos-1]:0)*e[len]%mod+mod)%mod;
	}
	inline bool same(int x,int y,int len)
	{
		if(x+len>n) return false;
		if(y+len>n) return false;
		return (getHash(x,len)==getHash(y,len));
	}
};

template <int P>
struct HashValue
{
	int hashValue[P];
	bool operator == (HashValue x)
	{
		for(int i=0;i<P;i++)
		{
			if(hashValue[i]!=x.hashValue[i]) return false;
		}
		return true;
	}
};

template <int P>
struct MultipleStringHash
{
	StringHash h[P];
	int n;
	inline void init(int _n)
	{
		n=_n;
		for(int i=0;i<P;i++)
		{
			h[i].init(n);
		}
	}
	inline void feedString(char c[])
	{
		for(int i=0;i<P;i++)
		{
			h[i].feedString(c);
		}
	}
	inline HashValue <P> getHash(int x,int len)
	{
		HashValue <P> g;
		for(int i=0;i<P;i++)
		{
			g[i]=h[i].getHash(x,len);
		}
		return g;
	}
	inline bool same(int x,int y,int len)
	{
		return (getHash(x,len)==getHash(y,len));
	}
};

template <int P>
struct PalindromeHash
{
	StringHash h[P];
	StringHash rh[P];
	int n;
	void init(int _n)
	{
		n=_n;
		for(int i=0;i<P;i++)
		{
			h[i].init(n);
		}
		for(int i=0;i<P;i++)
		{
			rh[i].init(n,h[i].prime,h[i].mod);
		}
	}
	void feedString(char c[])
	{
		n=strlen(c);
		for(int i=0;i<P;i++)
		{
			h[i].feedString(c);
		}
		reverse(c,c+n);
		for(int i=0;i<P;i++)
		{
			rh[i].feedString(c);
		}
		reverse(c,c+n);
	}
	bool checkOdd(int x,int len)
	{
		for(int i=0;i<P;i++)
		{
			if(h[i].getHash(x,len)!=rh[i].getHash(n-x-1,len)) return false;
		}
		return true;
	}
	inline int maxOdd(int x)
	{
		int l=1,r=min(x+1,n-x),mid,res=1;
		while(l<=r)
		{
			mid=l+r>>1;
			if(checkOdd(x,mid))
			{
				res=mid;
				l=mid+1;
			}
			else
			{
				r=mid-1;
			}
		}
		return res;
	}
};

inline vector <string> split(string x,char c)
{
	int l=x.size();
	vector <string> vec;
	int front=0;
	for(int i=0;i<l;i++)
	{
		if(x[i]==c)
		{
			if(i) vec.push_back(x.substr(front,i-front));
			front=i+1;
		}
	}
	if(x.back()!=c) vec.push_back(x.substr(front,(int)x.size()-front));
	return vec;
}
#include <string>
#include <string.h>
#include <stack>
#include <assert.h>
#include <bitset>
#define Endl endl
#define mp make_pair
#define ll long long 
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define over(A) {cout<<A<<endl;exit(0);}
#define all(A) A.begin(),A.end()
#define ceil(a,b) ((a-1)/b+1)
#define quickcin ios_base::sync_with_stdio(false);
const int mod=998244353;
const int inf=1039074182;
const ll llinf=1LL*inf*inf;
using namespace std;
template <typename T1,typename T2> inline void chmin(T1 &x,T2 b) {if(b<x) x=b;}
template <typename T1,typename T2> inline void chmax(T1 &x,T2 b) {if(b>x) x=b;}
template <typename T1,typename T2> inline void chadd(T1 &x,T2 b) {x+=b;if(x>=mod) x-=mod;};
template <typename T1,typename T2> inline void chmod(T1 &x,T2 b) {x%=b,x+=b;if(x>=b) x-=b;}
string s;
int k;
int dp[305][305][305];
int sum2[305][305];
int sum3[305][305];
int a[305];
int n;

inline void calc(int n)
{
	memset(sum2,0,sizeof(sum2));
	memset(sum3,0,sizeof(sum3));
	for(int i=0;i<=300;i++)
	{
		for(int j=0;j<=300;j++)
		{
			sum2[i][j]=(j?sum2[i][j-1]:0);
			chadd(sum2[i][j],dp[n][i][j]);
		}
	}
	for(int i=0;i<=300;i++)
	{
		for(int j=0;j<=300;j++)
		{
			sum3[i][j]=(i?sum3[i-1][j]:0);
			chadd(sum3[i][j],dp[n][i][j]);
		}
	}
}

inline int sub(int a,int b)
{
	a-=b;
	if(a<0) a+=mod;
	return a;
}

int main()
{
//	freopen("input.txt","r",stdin);
	memset(dp,0,sizeof(dp));
	cin>>s>>k;
	vector <string> t=split(s,'0');
	n=0;
	if(s.front()=='0') a[n++]=0;
	for(auto &x:t)
	{
		a[n++]=x.size();
	}
	reverse(a,a+n);
	int res=0;
	dp[0][0][0]=1;
	chmin(k,300);
	calc(0);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=k;j++)
		{
			for(int l=0;l<=j;l++)
			{
				//1. add
				chadd(dp[i][j][l],(l?sum2[j][l-1]:0));
				//2. none
				chadd(dp[i][j][l],dp[i-1][j][l]);
				//3. delete
				chadd(dp[i][j][l],sub((j?sum3[j-1][l]:0),(j-min(j,a[i-1])-1<0?0:sum3[j-min(j,a[i-1])-1][l])));
//				for(int del=1;del<=min(j,a[i-1]);del++)
//				{
//					chadd(dp[i][j][l],dp[i-1][j-del][l]);
//				}
			}
		}
		calc(i);
	}
	for(int i=0;i<=k;i++)
	{
		chadd(res,dp[n][i][i]);
	}
	cout<<res<<endl;
	return 0;
}

Measured memory_bytes: 115180